【问题标题】:ASCII and 64bit Registers AssemblyASCII 和 64 位寄存器汇编
【发布时间】:2014-04-25 13:30:27
【问题描述】:

当我从键盘输入 1 作为此代码的输入时,rbx 更改为 a31h。但是数字 '1' 的 ASCII 值是 30h。那么为什么rbx变成a30h呢?

section .text

global _start

_start:

mov rax,1
mov rdi,1
mov rsi,msg
mov rdx,len
syscall

mov rax,0
mov rdi,0
mov rsi,num
mov rdx,1024
syscall

mov rbx,[num]

mov rax,60
mov rdi,0
syscall

section .data

msg: db 0Ah,"Enter here:",0
len: equ $ - msg

section .bss

num: resb 10

【问题讨论】:

    标签: assembly 64-bit ascii cpu-registers


    【解决方案1】:

    因为您已将 1024 指定为长度,这意味着 read 系统调用获得 两个 字节,31h 表示字符 '1'0ah 表示换行符.

    如果你只想要一个字符,只要求一个字符,而不是 1024。

    而且,如果您尝试将全宽放入 rbx,请确保之后清除高位,例如:

    mov rbx, [num]
    and rbx, 0ffh
    

    虽然更好的解决方案可能只是加载一个零扩展的字节:

    movzx rbx, byte [num]
    

    【讨论】:

    • 由于您提供了代码示例,您可能还想提及movzx,这样人们就不会误认为and 方法是最好的。
    • @Jester,谢谢,这只是对 OP 如何完成它的警告,我并没有想太多 best 方式。但是,根据您的建议,我已经添加了它。
    • 明白了。谢谢你们的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2011-09-28
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2014-05-25
    相关资源
    最近更新 更多