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建议的那样,使用add
dword 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