Использование Jump and Compare на языке ассемблера

У меня есть этот код калькулятора ниже, он отлично работает, но не переходит к «делению»... я все еще изучаю программирование на ассемблере.. нужна помощь, как это понять...

.model small
.stack 100h

.data
msg1 db 13,10,13,10, "Enter 1st Number : $"
msg2 db 13,10, "Enter 2nd Number : $"
msgEr db 13,10, "Error $"
msgCh db 13,10, "Press A to ADD , S to SUBTRACT ,D to MULTIPLY, F to DIVIDE, X to EXIT : $ "
msgSum db 13,10,13,10, "Sum is : $"
msgDif db 13,10,13,10, "Difference is : $"
msgDiv db 13,10,13,10, "Quotient is : $"
msgMul db 13,10,13,10, "Product is : $"
tmp     db ?


.code

start:
mov ax, @data
mov ds, ax

lea dx, msg1
mov ah, 09h
int 21h
mov bx, 0

start1:
mov ah, 01h
int 21h
cmp al,0dh      
je next1
mov ah,0        
sub al,30h      
push ax         
mov ax,10d      
mul bx          
pop bx          
add bx,ax       
jmp start1      




next1:
push bx
lea dx,msg2
mov ah,09h
int 21h

mov bx,0


start2:
mov ah,01h
int 21h
cmp al,0dh
je choice
mov ah,0
sub al,30h
push ax
mov ax,10d
mul bx
pop bx
add bx,ax 
jmp start2


choice:
lea dx, msgCh
mov ah, 09h
int 21h

mov ah, 01h
mov answer, al
int 21h

cmp al,'f'
je dividing

cmp al,'a'  
je adding

cmp al,'s'
je subtracting

cmp al,'d'
je multiplying

cmp al,'x'
mov ah, 4ch
int 21h

error:
lea dx,msgEr
mov ah,09h
int 21h 
jmp start


dividing: 
pop ax
div bx
push ax
lea dx,msgDiv
mov ah,09h
int 21h 
pop ax
mov cx,0
mov dx,0
mov bx,10d
jmp break

adding:     
pop ax
add ax,bx   
push ax
lea dx,msgSum   
mov ah,09h
int 21h 
pop ax
mov cx,0
mov dx,0
mov bx,10d
jmp break   

multiplying: 
pop ax
mul bx      
push ax     
lea dx,msgMul   
mov ah,09h
int 21h 
pop ax
mov cx,0
mov dx,0
mov bx,10d
jmp break


subtracting: 
pop ax
sub ax,bx 
push ax
lea dx,msgDif
mov ah,09h
int 21h 
pop ax
mov cx,0
mov dx,0
mov bx,10d

break:
div bx
push dx
mov dx,0
inc cx
or ax,ax 
jne break 

ans:        
pop dx
add dl,30h
mov ah,02h
int 21h
loop ans

jmp start

end start


person Sachi Tekina    schedule 01.04.2013    source источник
comment
Пожалуйста, дополните. Когда вы достигаете оператора cmp al, 'f', действительно ли у вас есть строчная буква «f» в al, и тогда переход не происходит, или как он не будет прыгать?   -  person 500 - Internal Server Error    schedule 01.04.2013
comment
Также... mov dx, 0 перед div!   -  person Frank Kotler    schedule 02.04.2013
comment
О.. я просто добавляю 'mov dx,0', как вы сказали, и это работает.. можете ли вы объяснить эту часть, если все в порядке? спасибо   -  person Sachi Tekina    schedule 02.04.2013
comment
@SachiTekina: div bx делит 32-битное значение в dx:ax на bx и сохраняет частное в ax. Если частное слишком велико, чтобы поместиться в ax — что может случиться, если dx содержит какое-то случайное значение — вы получите переполнение деления. Вот почему вы должны очистить dx перед делением.   -  person Michael    schedule 12.09.2013


Ответы (2)


Перед выполнением операции необходимо очистить DX. Деление в x86 будет работать на DX:AX. Если вы сначала не очистите его, и в нем есть какой-то контент, вы можете столкнуться с состоянием переполнения. Очевидно, это плохо. :)

So:

dividing: 
pop ax
div bx

должно стать:

dividing: 
pop ax
mov dx,0
div bx
person David Hoelzer    schedule 15.12.2015

person    schedule
comment
Используйте функции редактора, чтобы пометить код как код и текст как текст. Это сделает ваш пост более читабельным. :) - person nologin; 19.04.2019
comment
Этот ответ в основном бесполезен, если вы не говорите (в тексте вне кода), что было не так и что вы изменили. - person Peter Cordes; 19.04.2019