linux - 如何在 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 程序集中将字符串打印到屏幕上?
提前致谢!
解决方案
我只想对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
再一次,非常感谢,并为我缺乏适当的装配错误检查而道歉!
推荐阅读
- c# - 作为 dotnet cli 工具启动时获取“此平台不支持 System.Data.SqlClient”
- awk - 文本处理:根据另一列值偏移一列中的日期值
- javascript - 在 Flutter Webview 中运行一些 Javascript 文件,例如 index.js
- mysql - 没有唯一值的连接表
- python - 验证集小于批量大小的 Keras DataGenerator 不进行验证
- mysql - 在使用内连接时限制在 SQL 中连接的行数,limit 和 order by
- mysql - 外部 GUID 以满足 mysql 中的唯一约束
- pointers - go中form参数为map时,传入的是什么?
- r - r edgar 错误:输入年份不是数字
- r - 如何根据与先前变量的加法累加创建新变量