使用 x64 汇编代码的基本输入

2024-03-31

我正在编写有关汇编中基本输入和输出的教程。我使用的是 64 位 Linux 发行版 (Ubuntu)。在教程的第一部分中,我讨论了基本输出并创建了一个简单的程序,如下所示:

global      _start
section     .text
_start:
    mov         rax,1
    mov         rdi,1
    mov         rsi,message
    mov         rdx,13
    syscall
    mov         rax,60
    xor         rdi,rdi
    syscall

section     .data
    message:    db          "Hello, World", 10

效果很好。系统打印字符串并干净退出。对于教程的下一部分,我只想从键盘读取一个字符。从我对此的理解web site http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/我们改变rdi注册为0对于 sys_read 调用。

我首先从当前值中减去8rsp然后将该地址加载到rsi登记。 (这就是我想存储字符的地方)。当我编译并运行我的程序时,它似乎可以工作......但终端似乎模仿我再次输入的输入。

这是程序:

global      _start            
section     .text
_start:
    sub         rsp,8           ; allocate space on the stack to read
    mov         rdi,0           ; set rdi to 0 to indicate a system read
    mov         rsi,[rsp-8]
    mov         rdx,1
    syscall

    mov         rax,1
    mov         rdi,1
    mov         rsi,message
    mov         rdx,13
    syscall
    mov         rax,60
    xor         rdi,rdi
    syscall

section     .data
    message:    db          "Hello, World", 10

这就是我的终端中发生的事情......

matthew@matthew-Precision-WorkStation-690:~/Documents/Programming/RockPaperScissors$ nasm -felf64 rps.asm && ld rps.o && ./a.out
5
Hello, World
matthew@matthew-Precision-WorkStation-690:~/Documents/Programming/RockPaperScissors$ 5
5: command not found
matthew@matthew-Precision-WorkStation-690:~/Documents/Programming/RockPaperScissors$

输入 5 被重复返回到终端after程序已退出。使用 NASM 和 Linux x64 读取单个字符的正确方法是什么?


在第一个代码部分中,您必须将 SYS_CALL 设置为0 for SYS_READ(正如其他答案中基本提到的)。

所以检查一下Linux x64 SYS_CALL 列表 http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/获取适当的参数并尝试

_start:
  mov         rax, 0          ; set SYS_READ as SYS_CALL value
  sub         rsp, 8          ; allocate 8-byte space on the stack as read buffer
  mov         rdi, 0          ; set rdi to 0 to indicate a STDIN file descriptor
  lea         rsi, [rsp]      ; set const char *buf to the 8-byte space on stack
  mov         rdx, 1          ; set size_t count to 1 for one char
  syscall
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 x64 汇编代码的基本输入 的相关文章

  • 尝试 SSH 时设备的 ioctl 不合适

    我正在尝试通过 SSH 连接几台服务器并尝试获取sudo l每个服务器的输出 下面是我正在执行的脚本 bin bash serverlist tmp servers while IFS read r server netgroup user
  • 编译器 libstdc++ 版本与系统版本

    我试图了解 g 如何选择它链接的 libstdc 版本 以及当库的 系统 版本不同时它意味着什么 我正在使用 gcc g 4 1 2 根据ABI 指南 http gcc gnu org onlinedocs libstdc manual a
  • java中filewriter的flush和close函数之间的区别

    我需要知道Java中的flush和close函数之间的确切区别是什么 当在写入文件期间将数据转储到文件中时 请提供一个例子 flush just确保所有缓冲数据都写入磁盘 在这种情况下 更一般地说 通过您正在使用的任何 IO 通道刷新 之后
  • 在 Linux 2.6.21 (glibc 2.3.5) 上进行 ARP 和反向 ARP

    我需要在任意 IP 网络上存储对第三方设备的持久引用 其中设备的 IP 地址可能是静态的或由 DHCP 随机分配 我不控制网络上的设备 也不能依赖 DNS 和其他现有的或与设备一起使用的临时网络协议 所以我被指示使用硬件地址和 ARP 进行
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • 使用 linux perf 工具测量应用程序的 FLOP

    我想使用 perf Linux 性能计数器子系统的新命令行接口命令 来测量某些应用程序执行的浮点和算术运算的数量 出于测试目的 我使用了我创建的一个简单的虚拟应用程序 请参见下文 因为我找不到任何为测量 FP 和整数运算而定义的 perf
  • Python:数百万个小文件的读写速度缓慢

    结论 看来 HDF5 是适合我的目的的方法 基本上 HDF5 是一种用于存储和管理数据的数据模型 库和文件格式 并且旨在处理令人难以置信的大量数据 它有一个名为 python tables 的 Python 模块 链接在下面的答案中 HDF
  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 操作系统崩溃的常见原因[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解 操作系统崩溃 不限于Windows崩溃 最常见的技术原因 从操作系统编程的角度 有哪些 我正在寻找一个不像 打开太多应用
  • 如何真正释放 Linux 中的大页面以供新进程使用?

    真的找不到太多关于此的信息 希望有人可以提供帮助 我正在假脱机使用 100GB java 堆作为大数据缓存 为了避免与文件系统缓存等内容发生冲突 并且因为它通常性能更好 我将其分配在大页面中 我保留了 51 200 x 2MB 大页面 一切
  • Snap-confine 具有提升的权限,并且不受限制,但应该受到限制。拒绝继续避免权限升级攻击

    我已经使用 snap 一段时间了 但最近升级后 当我尝试打开任何应用程序时 出现此错误 Snap confine has elevated permissions and is not confined but should be Refu
  • 在单个命令中使用前缀重命名文件夹中的所有文件

    重命名带有前缀的文件夹中的所有文件 Unix 假设一个文件夹有两个文件 a txt b pdf 那么它们都应该从一个命令重命名为 Unix a txt Unix b pdf 如果您的文件名包含没有空格并且你没有任何子目录 你可以使用一个简单
  • 在64位操作系统上以32位模式和64位模式编译ioctl函数的执行有什么不同?

    我有 64 位 Enterprise SuSE 11 我有一个应用程序 它打开 HIDRAW 设备并在其上操作 ioctl 函数以从该设备获取原始信息 如下所示 struct hidraw devinfo devinfo int fd op
  • Bash 中 $() 和 () 之间的区别

    当我打字时ls l echo file 支架的输出 这只是简单的回显 被获取并传递到外部ls l命令 就等于简单的ls l file 当我打字时ls l echo file 我们有错误 因为不能嵌套 内部外部命令 有人可以帮助我理解之间的区
  • 跟踪 pthread 调度

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • 使用 C++ 输出字符串覆盖 Linux 终端上的最后一个字符串

    假设我有一个命令行程序 有没有办法让我说的时候 std cout lt lt stuff 如果我不做std cout lt lt n 在另一个之间std cout lt lt stuff 东西的另一个输出将覆盖同一行上的最后一个东西 清理行
  • 如何使用libaudit?

    我试图了解如何使用 libaudit 我想接收有关使用 C C 的用户操作的事件 我不明白如何设置规则 以及如何获取有关用户操作的信息 例如 我想获取用户创建目录时的信息 int audit fd audit open struct aud
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • /proc/PID 文件格式

    我想从中检索一些流程信息 proc目录 我的问题如下 中的文件是否有标准格式 proc PID 例如 有这个proc PID status文件与Name t ProcName在第一行 我可以在其他地方用空格代替这个文件吗 t或者类似的东西

随机推荐

  • 故障安全集成测试期间的错误不会导致 Maven 构建失败

    我有 Failsafe 运行 Selenium 集成测试 如果我在测试中的断言之一未通过并且测试失败 那么 Maven 构建将按预期失败 但是 如果测试错误 构建会意外成功 输出如下 Tests run 1 Failures 0 Error
  • 使用 OleDbConnection 连接

    我正在尝试连接到具有两个表的数据库 但是 当我尝试登录后 出现错误 该错误表明零点处没有行 我认为这是因为我的联系 using System using System Collections Generic using System Lin
  • sscanf 读取数据不准确

    在 Matlab 中 可以将元胞数组中数字的字符串表示形式转换为双精度数组中的数字表示形式str2double或组合str2num and cellfun A 最近贴文 https stackoverflow com a 21794549
  • 是否可以使用 Selenium WebDriver 来自动化桌面应用程序?

    我正准备为目前处于开发初始阶段的 Web 桌面应用程序编写自动化测试 将使用的技术是 Laravel VueJS 和最重要的 Electron Framework Electron 是一个使用 JavaScript HTML 和 CSS 等
  • 从 SQL Server 2008 中的所有表中选择所有列

    如何从数据库的所有表中选择所有列 例如 Select From 在 SQL Server 2008 中 表列表非常非常大 并且有这么多列 是否可以不写列名来完成 或者也许进行一个返回表名称的选择 这个 SQL 将执行此操作 DECLARE
  • 设置对象彼此相等(java)

    所以我有一个名为 Person 的类 看起来像这样 public class Person private String personName public String toString return personName public
  • 使用 AutoFac 注入通用类型参数

    我想我真的很困惑我能用 AutoFac 做什么 有人可以让我走上正轨吗 我有一个基本类型 class PersonBase public string SaySomething return I am base 我派生出两个具体的类 cla
  • 自定义 ViewGroup 焦点处理

    假设我有一个可聚焦的自定义 ViewGroup 并且有一些可聚焦的子视图 适用于 Android 机顶盒的自定义垂直菜单 应在遥控器上做出反应 每当自定义 ViewGroup 获得焦点时 我需要将焦点传递给某些子视图 I set desce
  • 布局渲染后如何初始化 jQuery 对象?

    我想定义一些变量 以便在我的应用程序布局呈现后立即用于确定 jQuery 选择器的范围 我尝试用以下方式定义它们 Meteor startup function Define variables 但它不起作用 对象是空的 这是我声明我的应用
  • Pvr 在 cocos2d 3.2 版本中翻转:从 2.1 移植时的困境

    我目前正在将一个游戏从cocos2d 2 1版本移植到3 2版本 我们有超过 3600 个未翻转的 pvr gz 文件 例如在 2 1 下生成和工作的文件 我们使用TexturePacker测试了pvr图像的flipY选项 并且确实有足够的
  • Apache Ignite - (jvm-pause- detector-worker) JVM 暂停时间可能过长:

    使用 apache ignite 2 6 后 我在 JBoss 启动和停止时不断收到此警告 您能否帮我知道什么错误的配置会导致此警告 如果您需要更多详细信息 请告诉我 最有可能的是 JVM 正在经历长时间的垃圾收集暂停 可以配置详细的GC日
  • Keras 中的 5 层 DNN 使用 GPU 训练速度较慢

    我在 Keras 1 2 中使用 tensorflow gpu 作为后端编写了一个 5 层密集网络 并在我的 MacBookPro CPU 和 AWS 中的 P2 xlarge 实例 K80 启用 cuda 中对其进行训练 令人惊讶的是 我
  • 在事件中对 HTML 表格单元格(或整行)的背景颜色进行动画处理

    我有一张桌子 上面有一个菜单 食品 有几行和几列 第二列包含食品的链接 当用户点击它时 该商品已添加到购物车中 我想给用户一些点击和添加的视觉反馈 确实有效 我已经有一个用于添加链接的点击处理程序 商品点击进入购物车 一个简单的alert
  • 如何计算从 Shiny 中的文本输入框获取的数据?

    ui code library shiny shinyUI Use a fluid Bootstrap layout fluidPage Generate a row with a sidebar sidebarLayout Define
  • 将日期转换为特定格式的字符在R中

    我需要映射 3 4 个具有不同日期格式的不同数据帧 我们如何将日期转换为以下格式 YYYY MM DD 转换为以下格式的字符 MMM YY 从字符串创建日期对象 如果您的列已采用日期格式 请跳过此操作 original date lt as
  • 防止 SliverAppBar 标题在 Flutter 中收缩时换行

    我有一个 Flutter 应用程序 它在 CustomScrollView 中使用 SliverAppBar SliverAppBar 的标题非常长 因此当 AppBar 在滚动时压缩时 标题开始换行几次 我想在不使用溢出的情况下防止这种行
  • 根据条件合并不同行的字段

    亚马逊为其市场客户提供 CSV 报告 其中包含有关您销售的每篇文章的信息 每篇文章有四行 如下所示 orderid amounttype amountdescription amount 305 2406165 0572365 ItemPr
  • 每次点击都会弹出新窗口

    我有一个弹出窗口 我使用下面的脚本打开它 每次点击时 我想打开新的弹出窗口 据我了解 为窗口指定唯一的名称将解决问题 在本例中为 SampleWindow 保持窗户独特性的最佳方法是什么 还有其他方法可以管理 javascript 弹出窗口
  • Orchard CMS 事务错误

    我们的 Orchard 网站上经常随机出现以下错误 当在页面之间快速导航时 这种情况似乎最为普遍 日志中没有其他错误 因此我不确定如何找出根本原因 我们没有对 ODBC 或类似的东西做任何特殊的事情 这是 google 在搜索有关 Orch
  • 使用 x64 汇编代码的基本输入

    我正在编写有关汇编中基本输入和输出的教程 我使用的是 64 位 Linux 发行版 Ubuntu 在教程的第一部分中 我讨论了基本输出并创建了一个简单的程序 如下所示 global start section text start mov