assembly 如何在MASM中检查两种不同的情况?

wmomyfyw  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(85)

我需要检查用户输入(负整数)是否在[-200,-100]或[-50,-1]之间的两个范围内。

UPPER = -100
LOWER = -200
UPPER2 = -1
LOWER2 = -50    

getData:
     mov       eax, numCount
     add       eax, 1
     mov       numCount, eax
     mov       edx, OFFSET thirdNumPrompt
     call WriteString
     call ReadInt
     mov       userNum, eax

     cmp       eax, LOWER
     jl         numAddition
     cmp       eax, UPPER2
     jg         numAddition
     add       eax, total
     mov       total,eax
     loop       getData

字符串
我现在有这个,它只是检查整数是否在-200和-1之间,但我想排除-51和-99之间的整数。我怎么做呢?numAddition是程序的下一步,我希望它在用户输入超出范围的数字时运行。

t8e9dugd

t8e9dugd1#

我现在有这个,它只是检查整数是否在-200和-1之间,但我想排除-51和-99之间的整数,我该怎么做呢?

解决方案一

循环在第一个超出范围的数字处结束:

getData:
    ...

    cmp  eax, LOWER
    jl   .OutOfRange
    cmp  eax, UPPER
    jle  .WithinRange
    cmp  eax, LOWER2
    jl   .OutOfRange
    cmp  eax, UPPER2
    jg   .OutOfRange
.WithinRange:
    add  eax, total
    mov  total, eax
    dec  ecx
    jnz  getData
.Done:

    ...

.OutOfRange:
    ...                  ; numAddition

字符串

方案二

循环一直运行到最后,但超出范围的数字会被不同地处理:

getData:
    ...

    cmp  eax, LOWER
    jl   .OutOfRange
    cmp  eax, UPPER
    jle  .WithinRange
    cmp  eax, LOWER2
    jl   .OutOfRange
    cmp  eax, UPPER2
    jle  .WithinRange
.OutOfRange:
    ...                  ; numAddition
    dec  ecx
    jnz  getData
    jmp  .Done
.WithinRange:
    add  eax, total
    mov  total, eax
    dec  ecx
    jnz  getData
.Done:


用户输入(负数整数)
如果你能绝对确定这个数是负数,那么下一个版本就用3来代替4个cmp,这样做的原因是UPPER 2 =-1

方案三

循环在第一个超出范围的数字处结束:

getData:
    ...

    cmp  eax, LOWER
    jl   .OutOfRange
    cmp  eax, UPPER
    jle  .WithinRange
    cmp  eax, LOWER2
    jl   .OutOfRange
.WithinRange:
    add  eax, total
    mov  total, eax
    dec  ecx
    jnz  getData
.Done:

    ...

.OutOfRange:
    ...                  ; numAddition

方案四

循环一直运行到最后,但超出范围的数字会被不同地处理:

getData:
    ...

    cmp  eax, LOWER
    jl   .OutOfRange
    cmp  eax, UPPER
    jle  .WithinRange
    cmp  eax, LOWER2
    jge  .WithinRange
.OutOfRange:
    ...                  ; numAddition
    dec  ecx
    jnz  getData
    jmp  .Done
.WithinRange:
    add  eax, total
    mov  total, eax
    dec  ecx
    jnz  getData
.Done:

相关问题