我有一个小的装配程序,除了它之外我不会跳转到标签。我怀疑这是由于ASCII值和整数之间的比较。
section .bss
nvalue: resb 4
value: resb 4
section .data
inputPromptNValue db 'Enter a integer: '
inputPromptNValueLen equ $-inputPromptNValue
inputPrompt db 'Enter an integer: '
inputPromptLen equ $-inputPrompt
msg db 'msg one', 0xa
msgLen equ $-caseOneMsg
section .text
global _start
_start:
;prompt user
mov eax, 4
mov ebx, 1
mov ecx, inputPrompt
mov edx, inputPromptLen
int 80h
;read and store the user input
mov eax, 3
mov ebx, 0
mov ecx, nvalue
mov edx, 5
int 80h
;
mov ecx, nvalue
or ecx, 0x30
cmp ecx, 0x1 ; <--- this part isn't working
je someLabel ; <---
;.... more labels
someLabel:
;other instructions here
这个想法是基于某个整数(0-9)的用户输入,将选择一个选项(某个标签将被跳转到)。
当用户输入&#34; 1&#34;我希望上面的标签(someLabel
)可以跳转到。我该怎么做才能得到这种行为?
答案 0 :(得分:1)
这个想法是基于用户输入的某个整数(0-9)
因此,根据需要,您只需要一次输入一位数字。请注意,我特意使用了 digit 这个词,因为没有小数部分的一个或多个数字仍然是整数。
mov eax, 3
mov ebx, 0
mov ecx, nvalue
mov edx, 1
int 80h
现在您已准备好在内存位置读取值nvalue
mov cl, [nvalue]
它将在39H - >范围内。如果您没有按其他键,请在30H。在您的程序中检查这些类型的错误是个好主意。没有做任何其他事情,你的测试可以是;
cmp cl,31H
jz somelabel
或
cmp cl,'1'
jz somelabel
甚至
and cl,0xF
cmp cl, 1
jz somelabel
这些场景中的每一个都会跳转到 somelabel
仅使用任务所需的数据宽度byte,word,dword,qword,但如果内存位置nvalues的内容是;
32 00 00 00
然后
mov ecx, [nvalue]
cmp ecx, 32H
... even ...
cmp ecx, '2'
仍然可以使用,但是您不必要地强制汇编程序生成更大的代码。
尽管ECX被认为是通用寄存器,但具有其他功能,因此除非有理由,否则通常最好使用AL AX或EAX进行计算和比较。