【问题标题】:How to pause after output in assembly using nasm如何使用nasm在汇编中输出后暂停
【发布时间】:2020-10-24 15:31:13
【问题描述】:

我在尝试学习汇编程序时遇到问题,我从书中复制了 som 代码 在我为 64 位处理器和 GoLink 安装 nasm 之后。

经过一些尝试,a 能够将其编译为 exe 文件,该文件应在命令提示符中显示“Hello world”。

程序“工作”,但我看不到“hello world”,我猜它是因为它永远不会停止,或者我读的书是 linux 的汇编 - 但如果我没有错的话,两者都使用 x86。

这是代码:

section .data
    msg db      "Hello, World",0
section .bss
section .text
    global START
START:
        mov rax, 1
        mov rdi,1
        mov rsi, msg
        mov rdx, 12
        syscall
        mov rax, 60
        mov rdi ,0
syscall

我不想链接到 c 我想编写原始程序集。

【问题讨论】:

  • 是的,这段代码适用于 Linux;系统调用遵循 Linux API。它基本上不会在 Windows 上运行。如果您想为 Linux 编写代码,您可以安装 Linux,或者如果您想为 Windows 编写代码,请购买另一本书。
  • 它们都是x86,所以在两者上执行相同的指令;这是真的。但问题是您需要执行 哪些 指令才能让操作系统执行特定操作,例如输出字符串,并且操作系统之间的差异很大。这就像说“英语和法语都使用声波,所以我应该可以走进休斯顿的一家商店,说‘Je prendrai un cafe, s'il vous plaît’,然后喝杯咖啡。”
  • 您的问题标题似乎与您在问题中描述的内容无关。从一个已经打开的 shell 窗口运行它会将输出留在屏幕上(如果有的话)。或者将输出重定向到文件或管道到 hexdump。想要在输出后暂停通常是 Windows 问题,因为人们经常将他们的东西配置为在程序退出后立即关闭的窗口中运行程序。这很愚蠢;不要那样做。

标签: assembly x86 nasm


【解决方案1】:

当我需要暂停程序时,我会在代码段的末尾添加“pause:jmp short pause”。这是一个愚蠢的方法,但它有效。

【讨论】:

  • 如果你要忙着等待而不是进行系统调用,至少在循环中放一条pause 指令以减少功耗。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2011-02-21
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
相关资源
最近更新 更多