【问题标题】:Assembly ASCII integer being used in comparison用于比较的汇编 ASCII 整数
【发布时间】:2018-01-29 23:10:30
【问题描述】:

我有一个小型汇编程序,当我将它除外时,它不会跳转到标签。我怀疑这是由于 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),将选择一个选项(将跳转到某个标签)。

当用户输入值“1”时,我希望上面的标签 (someLabel) 会被跳转到。我该怎么做才能得到这种行为?

【问题讨论】:

  • 评论你的代码。很明显or ecx, 0x30 毫无意义。此外,字符是 1 个字节,但您正在处理 4 个字节。最后,学习使用调试器。
  • (foo | 0x30) == 1 总是错误的...您的意思是使用'1'1 的 ASCII 代码)而不是整数 1?那个 OR 仍然没有意义。
  • 是的。我的错误部分是使用整数 1 而不是 1 的 ASCII 码。这基本上是我的第一个汇编程序,所以我并没有真正意识到出了什么问题。感谢您的 cmets。

标签: assembly x86 nasm


【解决方案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 进行计算和比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2012-03-02
    • 1970-01-01
    • 2014-05-24
    相关资源
    最近更新 更多