Como hacer division resta sucesiva en ensamblador


16 de Diciembre del 2019

Estimado tengo algo del codigo pero solamente acepta numero de 1 digito hace la la resta pero no se como hacer el contador de cuantas veces se icieron las resta y asi optener el cociente y tambien optener el residuo obtener el cociente y el residuo

muestro el codigo que tengo :

 

.model small
.stack 

.data
n1 db 0
n2 db 0
r db 0

msg0 db 10,13,7,'Ingrese el dividendo menor o igual a 10: ', '$'
msg1 db 10,13,7,'Ingrese el divisor menor o igual a 10: ', '$'
msg2 db 10,13,7,'la resta esss: ', '$'

.code
mov ax, @data
mov ds,ax

;imprimr el mensaje de ingresar un numero y hacer la captura
;visualiza una cadena de caracteres

;mostrar el mensaje msg0
mov ah,09h
lea dx,msg0
int 21h

;capturar el numero dividendo por el teclado que seria la decena
mov ah,01h
int 21h
sub al,30h
mov n1,al

;**********************************

;mostrar el mensaje msg1
mov ah,09h
lea dx,msg1
int 21h

;capturar el numero divisor por el teclado
mov ah,01h
int 21h
sub al,30h
mov n2,al
;r va ha contener el resultado de la Divisicon 

    mov al,n1
    mov bl,n2
    sub al,bl
    mov r,al

    mov ah, 09h
    lea dx, msg2
    int 21h
    
    mov al,r
    AAM
    mov bx,ax
    mov ah,02h
    mov dl,bh
    add dl,30h
    int 21h

    mov ah,02h
    mov dl,bl
    add dl,30h
    int 21h
    
     .exit
end
         

David Carrero
12 de Agosto del 2026

Hola,

Tu código hace una única resta (sub al,bl), pero la división por resta sucesiva necesita repetir esa resta dentro de un bucle, contando cuántas veces se puede restar el divisor antes de que el resultado sea menor que él. Ese contador es el cociente, y lo que quede en el dividendo cuando ya no se pueda restar más es el residuo:

mov al, n1
mov bl, n2
mov cl, 0      ; cl sera nuestro contador = cociente

division:
    cmp al, bl
    jl fin_division     ; si dividendo < divisor, ya no podemos restar mas
    sub al, bl         ; restamos el divisor una vez mas
    inc cl             ; contamos esa resta
    jmp division

fin_division:
    mov cociente, cl     ; cl tiene el numero de restas = el cociente
    mov residuo, al      ; lo que queda en al = el residuo

Necesitas declarar dos variables más en tu sección .data, junto a n1, n2 y r:

cociente db 0
residuo db 0

La lógica del bucle es exactamente lo que significa «dividir por resta sucesiva»: si tienes 17 ÷ 5, restas 5 de 17 (quedan 12, cociente=1), restas 5 de 12 (quedan 7, cociente=2), restas 5 de 7 (quedan 2, cociente=3), y ahí paras porque 2 < 5. Cociente = 3, residuo = 2. El cmp + jl al principio del bucle es justo la comprobación de «¿todavía puedo restar una vez más?».

Para imprimir cociente y residuo por pantalla, puedes reutilizar exactamente la misma lógica que ya tienes para imprimir r (el AAM + separar en decenas/unidades con mov bx,ax), solo que aplicada a estas dos variables nuevas en vez de a r.

David Carrero