【发布时间】:2016-09-14 23:55:36
【问题描述】:
我是汇编新手,正在使用 AT&T 语法在 linux 64 位中编程。如果我将数字 1 存储在寄存器中,如何将其转换为 ascii 字符“A”?例如:
movl $1, %ebx
addl $64, %ebx
我可以将 64 加到 1 以得到 65(A 的十进制值),然后以某种方式将其转换为“A”并使用 write 系统调用将其发送到缓冲区吗?
编辑 1:在这里发布我的程序代码。
.section .data
message:
.long 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
length:
.long 10
.section .text
.globl _start
_start:
xorq %rdi, %rdi
xorq %rax, %rax
xorq %rbx, %rbx
xorq %rcx, %rcx
xorq %rdx, %rdx
movl length, %edx
loop:
cmpl %ecx, %edx
je loop_end
movl message(,%rdi,4), %eax
addl $64, %eax
pushq %rax
incq %rdi
incq %rcx
jmp loop
loop_end:
cmpq $0, %rcx
je exit
popq %rbx
pushq %rcx
movq $1, %rax
movq $1, %rdi
movq %rbx, %rsi
movl length, %edx
syscall
popq %rcx
decq %rcx
jmp loop_end
exit:
movq $60, %rax
movq $0, %rdi
syscall
【问题讨论】:
-
是的,您甚至可以使用
add $'A', %ebx使您的代码更易于阅读,并记录常量的用途。字符 是 整数,所以是的,您只需将字节存储在内存中并将指向该内存的指针传递给write(0, buf, 1) -
好的,但是如果我不想使用常量,我如何将 %ebx 寄存器中的 $65 转换为“A”?他们的任何操作都会转化为 ascii 吗?
-
创建一个临时缓冲区。在其中放入一个字符(65 是一个已经代表一个字符的值)。将缓冲区的地址传递给
sys_write系统调用。 -
@Mic:
65是'A',英文字母A的ASCII编码。无需进一步转换或修改;它已经是一个字符值。 (抱歉,我应该说add $'A'-1, %ebx,因为您希望 EBX 索引从 A=1 开始的字母表。64是'@'。使用符号常量的一个好处是不必经常查找 ASCII 表.) -
谢谢你们的回答。也许您可以查看我的代码并为我指明正确的方向。我将其发布在主要问题中。当我运行它时,它不会产生任何东西。我想我希望看到如下输出:a,b,c,d,e,f,g,h,i,j
标签: linux assembly x86-64 gnu-assembler att