DUDA CON XOR Y TECLADO

Iniciado por D4P50N, 23 Febrero 2013, 16:37 PM

0 Miembros y 1 Visitante están viendo este tema.

D4P50N

Hola gente, buenos dias, tengo una duda con un código que es muy básico sin embargo quisiera entender porque actua como actua.

En C, cuando ingresabas un caracter al programa c tomaba ese caracter del buffer y dejaba el caracter nulo de terminación osea \0 eso en ciertas ocasiones ocasionaba que c pensara que en el buffer ya estaba ingresado una caracter y lo tomaba, obviamente para ello tenia que limpiarse con anticipación.

Bueno yo estoy aprendiendo ensamblador y sucede que cuando voy a dividir un numero que ha sido entrado desde el teclado, siempre ocurre que en el resultado hay 5 unidades más. Luego investigue en internet y encontre un código similar al mio pero que funcionaba de maravilla lo estuve estudiando y la diferencia que encontre es que tenia la linea para limpiexa del registro de ax:

xor ax,ax

Se me vino a la mente la posibilidad de que ocurriera algo similar en ensamblador, estuve investigando pero no encuentro nada que haga referencia al teclado, entradas, buffer o algo parecido a lo que imagino. Alguien podría explicarme que sucede realmente?, les dejo una copia de mi código y una copia del código que encontre en internet.


Código que encontre en internet:

.model small
.stack 100
.data
msj1 db 'Numero 1: ','$'
msj2 db 13,10,'Numero 2: ','$'
msj6 db 13,10,'Division: ','$'
var1 db ?
var2 db ?
.code
.startup
mov ah,09h
lea dx, msj1 ;desplegar numero 1:
int 21h

mov ah,01h;leer caracter desde el teclado
int 21h;lee primer caracter
sub al,30h ;restar 30h para obtener el numero
mov var1,al ;lo guardo en var1
mov ah,09h
lea dx, msj2 ;desplegar numero 2:
int 21h

mov ah,01h;leer caracter desde el teclado
int 21h;lee primer caracter
mov bl, al ;mover a bl
;*****************DIVISION
xor ax,ax ;limpiamos el registro ax.
mov al,var1
div bl ; divide AX/BX el resultado lo almacena en AX, el residuo queda en DX
mov dl, al
add dl,30h
mov ah,02h
int 21h
.exit
end


Mi código:


.model small
stack 100h
.data
num1 db 13,10,'Numero 1: $'
num2 db 13,10,'Numero 2: $'
resultado db 13,10,"Resultado:","$"
divisor db 0
dividendo db 0
.code
.startup
mov ah,09h
lea dx, num1 ;desplegar numero 1:
int 21h
mov ah, 01h
int 21h
mov dividendo, al
mov ah,09h
lea dx, num2
int 21h
mov ah, 01h
int 21h
mov divisor, al
mov bl, al
div bl
add al, 48
mov dl, al
mov ah, 02h
int 21h
mov ah,4ch
int 21h
end

limbertx

holas somos 2 aprendiendo xD
soy nuevo en esto
pero si no estoy mal
antes de dividir tienes que limpiar ax ya que el resultado estara ahi.
asi que al hacer xor ax, ax  lo que hace es
colocar ax=0
asi me dijeron que es mejor hacer xor ax, ax
que usar mov ax, 0x0

ademas por lo general yo hago el xor eax, eax
y cuando dices que hay 5 numeros demas , "debe de ser basura que no haz limpiado antes de hacer la operacion DIV"
espero no estar mal.  xD