• Domingo 13 de Julio de 2025, 20:36

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - colitroni

Páginas: [1]
1
ASM (Ensamblador) / Re: Ayuda: Trabajar con Long int en Ensamblador
« en: Jueves 16 de Octubre de 2003, 21:51 »
Suponiendo instrucciones del 8086:

Los registros son de 16 bits y entonces trabajar con enteros (2 bytes) no hay problema ya que si haces una operacion por ejemplo:

    mov ax,0FFFFh
    mov bx,10
    mul bx

El resultado ahora lo pone en DX:AX con lo que puedes acceder al numero completo sin problema alguno

Ahora digamos que quiero dividir 40.002.850 (Long int) entre diez, yo intento hacer algo así, por ejemplo:

    mov dx,0262h      ; parte alta del numero
    mov ax,06522h    ; parte baja del numero
    mov bx,10
    div bx
y aqui el programa termina con un error, ya que en la division el cociente iria a AX y el resto a DX, pero es que DX sigue teniendo la parte alta de ese entero largo (porque el resultado es entero largo tb) ..... y en fin  mi problema es que no sé como se puede trabajar con numeros long int (4 bytes) teniendo registros de 16 bits para operaciones de suma, resta multiplicacion y división... a ver si alguien me hace ver la luz. Lo que tengo claro es que la variable numero seria DWord que son 4 bytes..... AYUDA.

Salu2.

2
ASM (Ensamblador) / Re: Novato pide ayuda con su primer procedimiento
« en: Jueves 9 de Octubre de 2003, 00:21 »
Bueno, esta es mi primera incursion en este lenguaje despues de leer y ver ejemplos. Lo que hago en el programa es leer un nº por teclado 2 bytes y lo que quiero es imprimirlo por pantalla y aqui es donde tengo el problema:

La tecnica que sigo es hallar el divisor (1,10,100,1000,10000) dependiendo de las cifras que tiene el nº introducido por el usuario; luego voy dividiendo el nº por el divisor, despues divido el divisor (para quitarle ceros) y ahi se produce un error de DIVIDE ERROR, el proc es el siguiente:

las definiciones que realizo son:

a dw ?        ;contiene el nº introducido

diez dw 10 ;cte de valor 10

PRINTNUM PROC NEAR
   mov dl,10   ; introduzco 1 retorno de carro
   mov ah,02
   int 21h
   mov dl,13   ; introduzco 1 retorno de carro
   mov ah,02
   int 21h
   mov ax,1   ; contador para saber el nº de cifras q tiene a
   mov bx,a   ; cargo en bx la variable a
   bucle:
   mul diez
   cmp ax,bx
   jbe bucle   ; multiplico ax por 10 hasta que ax>bx ojo el resultado es dx:ax
   div diez   ; asi tiene ax las mismas cifras q bx en este punto
   push ax   ; guardo el divisor
   SacaCifra:
   pop cx   ; meto el divisor en cx
   mov ax,bx   ; cargo en ax la variable cuyos digitos quiero mostrar
   div cx   ; y la divido por cx q será 1,10,100,1000 o 10000
   mov bx,dx   ; guardo el resto q es lo q queda por sacar
   mov dx,ax   ; ya que en ax está el cociente
   add dl,30h   ; así tengo el caracter ascii q coresponde al digito
   mov ah,02   ; lo saco en pantalla
   int 21h
   mov ax,cx   ; cargo el divisor en ax
   div diez   ; y le quito 1 cero ------------ ERROR QUE ME DA: DIVIDE ERROR ------------
   push ax   ; lo guardo en la pila
   cmp ax,1
   jae SacaCifra     
   ret
PRINTNUM   ENDP


Por cierto, al que quiera aprender como yo estoy haciendo, le recomiendo el emu8086 que es emulador, ensamblador y desensamblador todo en 1, funciona en Win9x,ME y XP y lo bueno es q si haces burradas, no se cuelga ya q es un emulador;) Si quisierais el nº de serie os podria pasar el mio para registrarlo;)

Salu2 y Espero vuestras respuestas

Páginas: [1]