首页 > 解决方案 > 如何在 x86_64 程序集中打印字符串

问题描述

我对组装比较陌生,并且编写了一个简单的程序来将数字 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 程序集中将字符串打印到屏幕上?

提前致谢!

标签: linuxassemblyx86-64nasm

解决方案


我只想对fuz说声谢谢。可悲的是,事实证明我的问题完全无关紧要,并且该错误出现在代码块之后的一段代码中,即进行了 write 调用。

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

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

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

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


推荐阅读