NASM 一次打印一个字符

2023-12-09

为什么这个程序没有打印到屏幕上,我是否遗漏了 INT 80 命令中的某些内容?

  section .bss

  section .data
      hello: db "Hello World",0xa      ;10 is EOL

  section .text
      global _start

  _start:

      mov ecx, 0;                      ; int i = 0;
  loop:
      mov dl, byte [hello + ecx]       ; while(data[i] != EOF) {
      cmp dl, 0xa                      ;
      je  exit                         ;
      mov ebx, ecx                     ; store conetents of i (ecx)

      ; Print single character
      mov eax, 4                       ; set sys_write syscall
      mov ecx, byte [hello + ebx]      ; ...
      mov edx, 1                       ; move one byte at a time
      int 0x80                         ;

      inc ebx                          ; i++
      mov ecx, ebx                     ; move ebx back to ecx
      jmp loop                         ;

  exit:
      mov eax, 0x01                    ; 0x01 = syscall for exit
      int 0x80                         ;

ADDITION

我的生成文件:

sandbox: sandbox.o
    ld -o sandbox sandbox.o

sandbox.o: sandbox.asm
    nasm -f elf -g -F stabs sandbox.asm -l sandbox.lst

修改后的代码:

section .bss

section .data
    hello: db "Hello World",0xa      ;10 is EOL

section .text
    global _start

_start:

    mov ecx, 0;                      ; int i = 0;
while:
    mov dl, byte [hello + ecx]       ; while(data[i] != EOF) {
    cmp dl, 0xa                      ;   
    je  exit                         ;   
    mov ebx, ecx                     ; store conetents of i (ecx)

    ; Print single character
    mov eax, 4                       ; set sys_write syscall
    mov cl, byte [hello + ebx]       ; ...
    mov edx, 1                       ; move one byte at a time
    int 0x80                         ;   

    inc ebx                          ; i++
    mov ecx, ebx                     ; move ebx back to ecx
    jmp while                        ;   

exit:    
    mov eax, 0x01                    ; 0x01 = syscall for exit
    int 0x80                         ;   

不打印的原因之一是因为ebx应该保存值 1 来指定stdin,另一个是因为sys_write将指针(字符串的地址)作为参数,而不是实际的字符值。

无论如何,让我向您展示一种更简单的构建程序的方法:

section .data

   SYS_EXIT  equ  1
   SYS_WRITE equ  4
   STDOUT    equ  1
   TRAP      equ  0x80
   NUL       equ  0

   hello: db "Hello World",0xA,NUL    ; 0xA is linefeed, terminate with NUL

section .text
    global _start

_start:
   nop                     ; for good old gdb
   mov ecx, hello          ; ecx is the char* to be passed to sys_write

read:
   cmp byte[ecx], NUL      ; NUL indicates the end of the string
   je exit                 ; if reached the NUL terminator, exit

   ; setup the registers for a sys_write call
   mov eax, SYS_WRITE      ; syscall number for sys_write
   mov ebx, STDOUT         ; print to stdout
   mov edx, 1              ; write 1 char at a time
   int TRAP;               ; execute the syscall

   inc ecx                 ; increment the pointer to the next char
   jmp read                ; loop back to read

exit:    
mov eax, SYS_EXIT      ; load the syscall number for sys_exit
mov ebx, 0             ; return a code of 0
int TRAP               ; execute the syscall

像我一样用 NUL 终止你的字符串会更简单,或者你也可以这样做$-hello在编译时获取它的长度。我还设置了寄存器sys_write在循环中的每次迭代中(正如您所做的那样),因为sys_write不保留所有寄存器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NASM 一次打印一个字符 的相关文章

随机推荐

  • 如何使用 XAML 绑定按钮单击来更改面板(网格)的内容

    我正在创建 WPF 应用程序的 UI 在致力于软件功能的实现时 我在创建 UI 方面没有太多经验 现在我需要一种方法来更改 属性 面板的内容 该面板有一个网格来包含内容 我创建了多个面板 隐藏了除一个之外的所有面板 现在我想在用户单击顶部功
  • Slim PHP 的默认 GET 路由

    我最近使用 Slim PHP 框架构建了一个小型 API 它运行得很好 然而 我想为根 设置一个 GET 路由 它以基本消息响应 并让任何其他 GET 请求返回 访问被拒绝 在阅读了文档和各种示例后 我无法弄清楚如何完成这些任务 我的项目仅
  • APC 3.1.x 的稳定性如何?

    是否有人在大容量站点的生产中使用 APC 3 1 x 3 1 系列被标记为 测试版 版本 但它具有我们真正希望拥有的一些功能 具体来说 apc clear cache user 的性能改进没有成为 3 0 19 那么 您是否在非常活跃的站点
  • Python - 根据列的最大值删除重复项

    我不太擅长使用 pandas 我认为 pandas 应该解决我的问题 我有一个文本文件 其中包含数据 id1 id2 value1 value2 value3 1 2 30 40 20 3 1 2 30 42 26 2 3 5 12 55
  • 从 NTFS-MFT 参考号获取文件信息

    在我的 C 应用程序中 我已经有一种方法来检查文件系统 但我想利用从主文件表 MFT 中读取数据的优势 因为它的速度要快得多 我了解 1 它是专有规范 因此如有更改 恕不另行通知 2 仅当应用程序在管理权限下运行时才能访问它 我设法通过读取
  • 在 xpath/domdocument 查询中查找与给定字符串匹配的链接

    使用 Xpath 和 domDocument 获取与给定单词匹配的链接进行显示时遇到问题 一切似乎都进展顺利for i 0 i lt documentLinks gt length i 用来 谁能帮我解决我哪里出错了 html ol htm
  • 更新预填充数据库

    我为 Android 设备创建了一个问答游戏 我有一个数据库 在资产文件夹和 dbHelper 类中存在问题 一切正常 但现在我想修复一些拼写错误并添加更多问题 我需要更新数据库 但我不知道该怎么做 我在互联网上找到了这个 dbHelper
  • 单击事件在具有触摸事件的 iPad 上不起作用

    我正在页面链接上使用点击事件 在 iPad 上运行良好Safari 但是当我在同一页面上使用触摸事件时 单击事件将停止工作 iPad 上只有触摸事件有效 点击事件 link onclick onLinkClick 触摸事件 sdiv bin
  • 为什么 Application.Speech.Speak 单独读取一些数字而不是将它们放在一起?

    假设现在是 11 点 11 分 它读作 一一 小时 十一 分钟 如下所示 Sub TEST1 Application Speech Speak It is Hour Now hours and Minute Now minutes End
  • UnicodeWarning:Unicode 相等比较无法将两个参数转换为 Unicode

    我知道很多人以前遇到过这个错误 但我找不到解决我的问题的方法 我有一个想要规范化的 URL url u http www dgzfp de Dienste Fachbeitr C3 A4ge aspx EntryId 267 Page 5
  • 与 CSS 并排的列内的元素保持相同的高度

    我有一个这样的模板 我想在两列的每一项之间保持相同的高度 具体取决于高度最大的一项 但前提是它们并排时 在较小的屏幕中 当它们的 width 100 时 每个 div 都有自己的高度 具体取决于其自己的内容高度 它应该看起来像这样 我认为我
  • 为什么 git 对标记为二进制的文件发出 CRLF 警告?

    我有一个已标记为二进制的文件 cat gitattributes dist binary git check attr a dist app js dist app js binary set dist app js diff unset
  • 程序崩溃时如何释放资源

    我有一个使用其他人的服务的程序 如果程序崩溃 关闭这些服务的最佳方法是什么 在服务器端 我将定义一些检查器来定期监视客户端是否无效 但是我们可以在客户端做任何事情吗 我不确定正常的 RAII 在这种情况下是否仍然有效 我的代码是用 C 和
  • Http Api 调用承诺的响应未定义 - Angular 2

    我在 WebAPI 中创建了一个 api 如下所示 public HttpResponseMessage Get var response Request CreateResponse HttpStatusCode OK response
  • 在弹出窗口中显示地图 v2 在 Android 中不显示?

    我想打开弹出窗口 我使用地图 v2 在弹出窗口中显示地图 v2 但不显示 在这里我放置了我的 xml 布局和活动类 main xml
  • 如何在 CUDA 中使用 2D 数组?

    如何分配大小为 MXN 的二维数组 那么如何在 CUDA 中遍历该数组呢 global void test int A BLOCK SIZE BLOCK SIZE int B BLOCK SIZE BLOCK SIZE int C BLOC
  • R中的正则表达式删除字符串最后一个空格之后的部分

    我想要一个gsubR 中的表达式用于删除字符串中最后一个空格之后出现的所有内容 例如 string Da Silva UF 应该归还我 Da Silva 有什么想法吗 Using anchor gt string Da Silva UF g
  • GL_TRIANGLES 有效,但 GL_QUADS 不显示任何内容

    所以我从一个程序切换到另一个程序 我不明白为什么 但 GL QUADS 将不再显示相同的代码 为了尝试找出为什么旧代码不起作用 我编写了这个新的简单代码 但它仍然不起作用 设置 vector
  • Windows 上的 xlwings 和 python 3.5

    我已经被困了一段时间了 我的配置是 python 3 5 xlwings 0 5 0 and Windows 7 我在尝试时得到以下回溯import xlwings Traceback most recent call last File
  • NASM 一次打印一个字符

    为什么这个程序没有打印到屏幕上 我是否遗漏了 INT 80 命令中的某些内容 section bss section data hello db Hello World 0xa 10 is EOL section text global s