我是新来的程序集,并且我正在使用ATL & T语法在linux 64位编程。如果我将数字1存储在一个寄存器中,我怎样才能将它转换为ASCII字符“A”?例如:汇编:如何将数字转换为ASCII并写入显示缓冲区
movl $1, %ebx
addl $64, %ebx
我可以添加64到1,使65(A的十进制值),然后以某种方式将其转换为“A”和使用写系统调用发送该到缓冲区?
编辑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? – Mic
创建一个临时缓冲区。在其中放置一个字符(65是一个已经表示字符的值)。将缓冲区的地址传递给'sys_write'系统调用。 –