assembly 调用程序集中的调用函数时,调用无法正常工作

kxkpmulp  于 2023-02-12  发布在  其他
关注(0)|答案(1)|浏览(126)

我有点新组装,所以我试图创建一个购票系统,其中有4个功能。用户可以输入1至4选择功能,但当我输入4运行重置功能,它运行视图_comp功能(这是第三个功能)。其他3个功能正常工作,但只有第四个功能有问题

.model small
.stack 150h
.data
Menu db 10, 13, 'Enter a choice (1 to 2):'
db 10, 13, '1) Enter 1 to view activites'
db 10, 13, '2) Enter 2 to view workshop'
db 10, 13, '3) Enter 3 to view competition'
db 10, 13, '4) Reset value', 10, 13, '$'

msg db 10,13, "activities $10"
msg2 db 10,13, "workshop $15"
msg3 db 10,13, "view competition $20"
Fdigit db 0
Sdigit db 0

result db 10,13,"sum= : $"
afd db '1'
asd db '0'
wfd db '1'
wsd db '5'
cfd db '2'
csd db '0'

.code

Main proc

mov ax,@data
mov ds,ax

DisplayMenu:
mov dx,OFFSET Menu
mov ah,9
int 21h
mov ah,1
int 21h

cmp al, '1'
je view_activites 
cmp al, '2'
je view_workshop
cmp al, '3' 
call view_comp
cmp al, '4'
call reset 


view_activites:
; code to view activites
mov ah,09h
mov dx,offset msg
int 21h

mov bl,Sdigit 
sub bl,30h
mov cl,asd

add bl,cl

mov al,bl
mov ah,00h
aaa

mov cl,al
mov bl,ah

mov bh,Fdigit
sub bh,30h
mov ch,afd

add bl,bh
add bl,ch

mov al,bl
mov ah,00h
aaa

mov bx,ax
;mov bh, ah
;mov bl,al

mov dx, offset result
mov ah,09h
int 21h

;1st digit
mov Fdigit,bl
mov dl,Fdigit
add dl,30h
mov ah,02h
int 21h

;2nd digit
mov Sdigit,cl
mov dl,Sdigit
add dl,30h
mov ah,02h
int 21h
jmp DisplayMenu
ret


view_workshop:
; code to view workshop
mov ah,09h
mov dx,offset msg2
int 21h

mov bl,Sdigit
sub bl,30h
mov cl,wsd

add bl,cl

mov al,bl
mov ah,00h
aaa

mov cl,al
mov bl,ah

mov bh,Fdigit
sub bh,30h
mov ch,wfd

add bl,bh
add bl,ch

mov al,bl
mov ah,00h
aaa
mov bx,ax

;1st digit
mov Fdigit,bl
mov dl,Fdigit
add dl,30h
mov ah,02h
int 21h

;2nd digit
mov Sdigit,cl
mov dl,Sdigit
add dl,30h
mov ah,02h
int 21h
jmp DisplayMenu
ret

view_comp:
mov ah,09h
mov dx,offset msg
int 21h

mov bl,Sdigit 
sub bl,30h
mov cl,csd

add bl,cl

mov al,bl
mov ah,00h
aaa

mov cl,al
mov bl,ah

mov bh,Fdigit
sub bh,30h
mov ch,cfd

add bl,bh
add bl,ch

mov al,bl
mov ah,00h
aaa

mov bx,ax
;mov bh, ah
;mov bl,al

mov dx, offset result
mov ah,09h
int 21h

;1st digit
mov Fdigit,bl
mov dl,Fdigit
add dl,30h
mov ah,02h
int 21h

;2nd digit
mov Sdigit,cl
mov dl,Sdigit
add dl,30h
mov ah,02h
int 21h

jmp DisplayMenu
ret

reset:

    mov Fdigit,0
    mov Sdigit,0
    
mov dx, offset result
mov ah,09h
int 21h
    
    ;1st digit
mov Fdigit,0
mov dl,Fdigit
mov ah,02h
int 21h

;2nd digit
mov Sdigit,0
mov dl,Sdigit
mov ah,02h
int 21h
    
jmp DisplayMenu

ret


quit_program:
mov ah,09h
mov dx,offset Fdigit
int 21h
mov ah,4ch
int 21h

Main endp
End main

我希望上面的代码能正常工作,但现在我不知道如何解决这个问题。

qv7cva1a

qv7cva1a1#

cmp本身不足以改变程序的执行路径。前两个是正确的,但后两个将执行,而不管上面的比较结果如何。虽然CPU将al与3进行了比较,但它没有 * 根据比较结果做任何事情。* 本质上,cmp al, '3'flags寄存器如何受影响方面与sub al, '3'相同,但al的内容保持不变。对于前两种情况,我们使用je基于flags进行分支。正如PeterCordes所解释的,实际上,您可以通过重新排列代码以减少分支来对此进行一些优化。可能有比我在这里展示的更好的方法,但这只是一个示例。(根据每个标签下的代码量,您可能会超过je上的距离限制,因此请记住这一点。)

cmp al, '1'
je view_activites 
cmp al, '2'
je view_workshop
cmp al, '3' 
je view_comp

;else, reset

reset:
    mov Fdigit,0
    mov Sdigit,0
    ;rest of reset code goes here
    jmp DisplayMenu

view_activities:
    ; put your code here
    jmp DisplayMenu

view_workshop:
    ; put your code here
    jmp DisplayMenu

view_comp:
    ; put your code here
    jmp DisplayMenu

quit_program:
    ; put your code here

相关问题