assembly 组件中的打印编号[副本]

8hhllhi2  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(130)

此问题在此处已有答案

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部分,我就可以获取并输出它。那么,是不是我不能输出整数,而必须将它存储在某个数据变量中呢?

3pmvbmvn

3pmvbmvn1#

在不知道syscalls的确切语法的情况下,在我看来,您至少需要转换加法的结果(3)成串(“3,”即51是ASCII码--对于一位数,请尝试添加48)。字节值3不能对可打印字符进行编码,因此即使对“print”例程的调用是正确的,输出也可能不会显示在控制台中。

相关问题