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

标签 linux assembly x86-64 nasm

<分区>

我对汇编比较陌生,并且编写了一个简单的程序来将数字 1 到 10 打印到屏幕上。然而,在我编写它后不久,我意识到我需要将它从 x86 程序集转换为 x86_64 程序集才能在我的主工作站上运行。

大部分转换都进行得相当顺利,除了一个 block ,它在屏幕上打印数字,一旦它们被转换为字符串。

在 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 汇编中将字符串打印到屏幕上吗?

提前致谢!

最佳答案

我只想非常感谢 fuz .可悲的是,事实证明我的问题完全无关紧要,错误出现在代码块之后的一段代码中,该代码块是进行写入调用的地方。

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

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

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

但是,这没有用,因为它没有抛出任何错误,我假设错误就在它之前的代码中,问题的 block ,它规定了打印 block 的 channel 。正确的代码如下所示:

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

再次,非常感谢,并为我缺乏适当的 assembly 错误检查而道歉!

关于linux - 如何在 x86_64 程序集中打印字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56997054/

相关文章:

regex - Linux 终端中整个目录的正则表达式搜索和替换

C——汇编消息

linux - 确定在 GNU/Linux 中启动程序所需的时间?

c - 为什么gcc将8字节格式的char类型传递给函数汇编

c - GCC x86-64 次优汇编输出,为什么?

linux - 如何将包含空格的字符串转换为 shell 中的数组?

Linux命令不是很清楚

c++ - Linux 中的套接字

assembly - GNU 对具有全局标签的 jmp 感到奇怪

optimization - 是否有任何好的、现代的在线指南来手动优化汇编代码?