NASM汇编:如何将.byte存储的十六进制字母转为对应long型十进制值
问题解答
问题1:语法不匹配
你注明代码为NASM汇编,但实际给出的是AT&T语法(GNU汇编器GAS使用的语法),两者操作数顺序、寻址规则完全不同,如果使用NASM编译这段代码会直接报错,运行结果必然不符合预期。
问题2:段声明错误
你代码中的.data:是带冒号的标签写法,不会被汇编器识别为数据段声明,只会被当成普通代码段标签。这导致你定义的bit、result变量实际上被分配到了代码段,而非数据段:
- 你预期
bit存储的是字符'A',但实际读取时拿到的是代码段对应位置的指令字节,通常x86_64环境下代码段的指令前缀很多为0x48(对应ASCII字符'H'),计算时0x48 - 0x41 = 7,加10后得到17,正好比预期的10大7,完全符合你遇到的现象。
问题3:数据宽度不匹配
result是4字节的long类型,你用movb %ah, result仅写入了result的低8位,如果你没有正确初始化result的高24位为0,高24位的垃圾值也会导致最终结果偏大。
修正后的AT&T语法参考代码
# 正确声明数据段,不需要加冒号 .data bit: .byte 'A' result: .long 0 # 正确声明代码段 .text .global _start _start: movb bit, %ah # 加载字符到ah movb $'A', %al # 加载基准字符'A'到al subb %al, %ah # 计算字符偏移量 movzbl %ah, %eax # 把8位偏移量零扩展为32位,避免高位垃圾值 addl $10, %eax # 偏移量加10得到最终数值 movl %eax, result # 完整写入4字节结果 # Linux系统调用退出,方便调试查看结果 movl $1, %eax movl $0, %ebx int $0x80
内容的提问来源于stack exchange,提问作者Dudu Dudu
相关产品推荐
相关产品推荐

