如何在x86_64程序集中打印字符串

时间:2019-07-11 20:44:16

标签: linux assembly x86-64 nasm

我是刚接触汇编的人,并且编写了一个简单的程序将数字1到10打印到屏幕上。但是,在我编写它后不久,我意识到我需要将其从x86转换为x86_64程序集,以便在主工作站上运行。

大多数转换都进行得很好,除了一个块,一旦将数字转换为字符串,该块就会在屏幕上打印数字。

在x86中,要打印的代码是:

mov edx, eax
pop eax
mov ecx, eax
mov ebx, 1
mov eax, 4
int 80h

当我将其转换为x86_64时,我试图通过简单地更改寄存器名称来使其工作。

mov rdx,rax
pop rax 
mov rcx, rax
mov rbx, 1
mov rax, 4
int 80h

在程序中,rax保留要打印的ASCII数字的值。

现在在64位环境中运行该程序时,屏幕上不会输出任何输出,并且该程序完成了执行,没有任何错误或消息。

有什么方法可以在x86_64程序集中将字符串打印到屏幕上?

谢谢!

1 个答案:

答案 0 :(得分:1)

我只想对fuz表示感谢。可悲的是,事实证明我的问题是完全不相关的,并且该错误是在代码块之后的一段代码中进行的,在该代码块中进行了写调用。

当他告诉我展示完整的程序时,我快速浏览了一下代码,发现了问题。

以前,我曾尝试使用以下方式进行打印:

mov rdx,rax
pop rax 
mov rcx, rax
mov rbx, 1
mov rax, 4
int 80h

但是,这不起作用,并且由于它没有引发任何错误,因此我认为该错误位于其前面的代码中,即该问题的代码块,该代码块限制了打印块的传递。正确的代码如下所示:

mov rdx,rax
pop rax
mov rsi, rax
mov rdi, 1
mov rax, 1
int 80h

再次,非常感谢和抱歉,我没有适当的组装错误检查!