用于比较的汇编ASCII整数

时间:2018-01-29 23:10:30

标签: assembly x86 nasm

我有一个小的装配程序,除了它之外我不会跳转到标签。我怀疑这是由于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)可以跳转到。我该怎么做才能得到这种行为?

1 个答案:

答案 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进行计算和比较。