此问题在此处已有答案:
Writing a putchar in Assembly for x86_64 with 64 bit Linux?(1个答案)
Why does adding a '0' to an int digit allow conversion to a char?(6个答案)
x86 assembly - how to show the integer 2, not the second ASCII character(1个答案)
How do I print an integer in Assembly Level Programming without printf from the c library?(5个答案)
两个月前关门了。
我目前正在学习编写我自己的编程语言。目前我的语言支持两个数的加法或减法,我现在想把我的AST转换成汇编。我在x86_64架构的Linux机器上运行,我已经用看起来像这样的代码完成了hello world教程:
section .data
string1 db "Hello World!",10,0
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, string1
mov rdx, 13
syscall
mov rax, 60
mov rdi, 0
syscall
我知道这里发生了什么。我有点困惑的是这样的代码:
section .text
global _start
_start:
mov rax, 1
mov rbx, 2
add rax, rbx
mov rsi, rbx
mov rax, 1
mov rdi, 1
mov rdx, 1
syscall
mov rax, 60
mov rdi, 0
syscall
根据我的阅读,上面的代码应该将值1
放入寄存器rax
,将2
放入寄存器rbx
,将这些寄存器相加并将其存储在rbx
中。然后,将rbx
的值移动到rsi
中,这应该是syscall
的缓冲区参数,以便写入。相反,我的控制台没有输出任何东西。如果我把"3"
作为变量放在.data
部分,我就可以获取并输出它。那么,是不是我不能输出整数,而必须将它存储在某个数据变量中呢?
1条答案
按热度按时间3pmvbmvn1#
在不知道syscalls的确切语法的情况下,在我看来,您至少需要转换加法的结果(3)成串(“3,”即51是ASCII码--对于一位数,请尝试添加48)。字节值3不能对可打印字符进行编码,因此即使对“print”例程的调用是正确的,输出也可能不会显示在控制台中。