NASM汇编使用or指令后预期输出Z却出现乱码问题求助
问题原因
- 核心错误是多执行了一步无意义的
add al, byte '0'操作:- 执行
or al, bl之后,al的值已经是0x5A,刚好对应ASCII表中的大写字母Z '0'的ASCII值是0x30,相加后al变成0x5A + 0x30 = 0x8A,超出了常规可打印ASCII字符的范围,所以输出乱码
- 执行
- 如果想要输出小写的
z,不需要加'0',可以直接把bl的值设为0x60,或者在得到0x5A之后加0x20(大小写字母的ASCII差值为32,即十六进制0x20)
修正后代码示例
section .text global _start _start: mov al, 1ah ; 0001 1010 mov bl, 60h ; 0110 0000 or al, bl ; 0111 1010 ==> 'z' mov [result], al mov eax, 4 ; syscall (write) mov ebx, 1 ; file descriptor mov ecx, result ; message to write mov edx, 1 ; message length int 0x80 ; call kernel outprog: mov eax, 1 int 0x80 segment .bss result resb 1
编译运行命令
和你原来的命令保持一致即可正常输出小写z:nasm -f elf hello.asm ; ld -m elf_i386 -s -o hello hello.o; ./hello
内容的提问来源于stack exchange,提问作者foe
相关产品推荐
相关产品推荐

