0
TITLE Allowance


INCLUDE irvine32.inc

.DATA
 welcomeMessage BYTE "Welcome To Allowance Calculator", 0 ;
 inputMessage BYTE "Please Enter Salary", 0 ;
 salary WORD ?
 allowance WORD ?
 total WORD ?

 ten WORD 10
 five WORD 5
 hundred WORD 100
 limit WORD 2D

 great BYTE "I'm in greater"

.CODE
main PROC
   MOV EAX, 0
   MOV EBX, 0
   MOV ECX, 0
   MOV EDX, 0
   Sub limit, 1D

   Call DumpRegs

   MOV EDX, offset welcomeMessage
   Call WriteString 

   MOV EDX, offset inputMessage
   Call WriteString
   Call ReadDec
   MOV salary, Ax

   cmp Ax, 100D
   Call DumpRegs
   Call WriteInt

   JLE lesser
   JG greater

   greater: 
    MOV EDX, offset great
    Call WriteString
    MOV EAX, 0
    MOV Ax, salary
    MUL ten
    DIV hundred

    MOV allowance, Ax
    Call WriteInt
    JMP end1

    lesser:
        MOV EAX, 0
        MOV Ax, salary
        MUL five
        DIV hundred

        MOV allowance, Ax
        Call WriteInt
        JMP end1

    end1:
        exit
main ENDP

结束主

当我使用 CMP 命令进行比较时,它只会带我去 JGE.. 无论值是什么.. 有什么解决方案吗?

我也尝试使用 JE 并给出相同的输入,但即便如此,我也获得了更大的标签。

4

1 回答 1

2

cmp指令修改标志,跳转指令根据标志状态做出决定。这些标志可能被这些call(正确地WriteInt)修改:

Cmp Ax, 100D
Call DumpRegs
Call WriteInt
JLE lesser
JG greater

jle行为jg将是出乎意料的。您可以在调用 using 之前存储标志状态pushf,然后使用 恢复它们popf,例如:

Cmp Ax, 100D
pushf
Call DumpRegs
Call WriteInt
popf
JLE lesser
JG greater
于 2013-10-10T17:22:43.830 回答