Assembly 将用户输入的数字与值(EBX)进行比较
我想将用户输入并保存在堆栈中的数据与我生成的常量进行比较。这些常数称为Assembly 将用户输入的数字与值(EBX)进行比较,assembly,x86,masm,Assembly,X86,Masm,我想将用户输入并保存在堆栈中的数据与我生成的常量进行比较。这些常数称为min和max 用户输入的数字保存在名为Num的变量中,该变量位于堆栈中的ebp+8中。我想使用cmp将该值与常数进行比较,以便检查数字是否在允许的范围内 提供了问题的图片 如评论所述,您在代码中编写了类似于cmp[ebx],10的内容,这对于汇编程序来说是不明确的(在32b模式下,可以从中汇编3条不同的指令,针对字节、字或DWORD内存大小以及3个[size-]不同的立即值),因此cmp DWORD ptr[ebx],10将
min
和max
用户输入的数字保存在名为Num
的变量中,该变量位于堆栈中的ebp+8
中。我想使用cmp
将该值与常数进行比较,以便检查数字是否在允许的范围内
提供了问题的图片
如评论所述,您在代码中编写了类似于
cmp[ebx],10
的内容,这对于汇编程序来说是不明确的(在32b模式下,可以从中汇编3条不同的指令,针对字节、字或DWORD内存大小以及3个[size-]不同的立即值),因此cmp DWORD ptr[ebx],10
将解决这个问题,但是还有更多的问题,这里是固定的代码+建议在*代码>注释(带星号):
获取数据过程
;设置堆栈框架
推ebp
电动汽车
;询问用户
再一次:
mov-edx,OFFSET-ask
通话记录
呼叫ReadDec
mov ebx,[ebp+8];*ebx更本地地加载到它的使用中
;* 这是反性能的,但使源代码更易于阅读和检查
;* 您不需要担心修改ebx的一些子程序
;* 因为它正在等待用户输入,所以性能没有问题
mov[ebx],eax
;检查输入
;* cmp dword ptr[ebx],最小值
;* ^ ^ ^ ^ ^ 这会起作用,但值仍在eax中
cmp eax,最小值;*那为什么不比较一下呢!
jl诺诺
cmp eax,最大值;*也在这里
jg诺诺
;* 好的,回来吧
流行ebp
ret 4
诺诺:
mov edx,偏移错误
通话记录
呼叫CrLf
还是jmp;*JMP,不是循环!
;* Loop将修改ECX,当ECX降至零时,Loop将不会跳转
getData ENDP
实际上,您可以在ReadDec
之后立即执行检查,并且仅当值在合法范围内时才存储该值,如下所示:
。。。
呼叫ReadDec
;检查输入
cmp-eax,最小值
jl诺诺
最大值
jg诺诺
;* 物超所值,存储+返回
移动edx,[ebp+8];*我会使用EDX,它已经为WriteString修改过了
mov[edx],eax;*所以也不需要修改EBX
流行ebp
ret 4
... ; 诺诺:“上面的代码
不要发布问题的图片。尤其是没有显示所有相关信息的信息(如何定义min
)。无论如何,我猜你是在比较2个内存操作数,这是无效的。首先将一个加载到寄存器中。顺便说一下,它已经在eax
中,所以只需执行cmp-eax,min
。另外,请参阅指令集参考。请以文本形式发布代码,图片是无用的。可能汇编程序不知道cmp立即操作的操作数大小。根据您的汇编程序,可能需要使用cmpl
或cmp-dword-ptr
。(或者是别的什么;我不确定这是哪一个汇编程序。)对此我很抱歉。我是这个网站的新手。我刚刚将代码发布到问题中。正如prl建议的那样,使用adddword ptr
添加到问题中。汇编器无法从操作数推断[ebx]处的数据大小,以比较最小值和最大值。因此,需要在内存操作数上指定大小。尝试cmp-dword-ptr[ebx],min
和cmp-dword-ptr[ebx],max
。这迫使comaprison dor将EBX指向的内存地址处的32位DWORD与min
和max
TITLE template
INCLUDE Irvine32.inc
min = 10
max = 200
lo = 100
hi = 999
.data
ask BYTE "How many numbers should be generated? [10 .. 200]: ",0
Num DWORD ?
wrong BYTE "Invalid input",0
.code
main PROC
push OFFSET Num
call getData
exit
main ENDP
getData PROC
;Set up the stack frame
push
ebp
mov ebp, esp
mov ebx, [ebp+8]
;Ask the user
again:
mov ebx, [ebp+8]
mov edx, OFFSET ask
call WriteString
call ReadDec
mov [ebx], eax
;Check the input
cmp [ebx], min
jl nono
cmp [ebx], max
jg nono
jmp okay
nono:
mov edx, OFFSET wrong
call WriteString
call CrLf
loop again
okay:
pop ebp
ret 4
getData ENDP
END main