0

所以这是我的问题,每当我按“a”并且它满足条件时,它都会打印“a:”下的文本,然后也打印“b:”中的文本。我如何在不同的条件下互相打破?谢谢 :)

cmp byte ptr [temp+2], 'a'      ;condition
je a  

cmp byte ptr [temp+2], 'b'      ;condition
je b

a:
mov dx, offset msgA             ;land
mov ah, 09
int 21h 

b:
mov dx, offset msg14            ;water
mov ah, 09
int 21h 


ret                                   
msgA db 10, 13, "                           Land:$"
msg14 db 10, 13, "                           Water:$"
4

3 回答 3

0

程序流程在您的int 21h指令之后继续 - 在您的情况下,这是b:标签上的代码。如果你不想这样,你需要在int指令完成后跳转到不同的地址:

...
a:
    mov dx, offset msgA         ; land
    mov ah, 09
    int 21h 
    jmp done                    ; program continues here after the `int` instruction

b:
    mov dx, offset msg14        ; water
    mov ah, 09
    int 21h 

done:
    ret
...

由于您完成后所做的只是从过程中返回,因此您也可以简单地使用 aret而不是jmp.

于 2016-03-04T10:33:56.013 回答
0

标签不是障碍;它只是程序中某个位置的名称,可以方便地访问该位置。

与往常一样,如果您想更改控制流,请使用某种分支指令,例如:

a:
mov dx, offset msgA             ;land
mov ah, 09
int 21h 
jmp done

b:
mov dx, offset msg14            ;water
mov ah, 09
int 21h 

done:
于 2016-03-04T10:34:17.080 回答
0

是的,这就是您编码的行为。它只是从a:b:。因此,只需将jmps 添加到末尾,它就会按需要工作。

cmp byte ptr [temp+2], 'a'      ;condition
je a  

cmp byte ptr [temp+2], 'b'      ;condition
je b
jmp finish                      ; --- add this for the case, that neither 'a' nor 'b' was the input

a:
mov dx, offset msgA             ;land
mov ah, 09
int 21h 
jmp finish                      ; --- JMP to the end - do not fall through

b:
mov dx, offset msg14            ;water
mov ah, 09
int 21h 
jmp finish                      ; --- JMP to the end - in this case not necessary, but just in case you'd add more cases

finish:
ret   
于 2016-03-04T10:35:34.630 回答