【问题标题】:Assembly language x86 - using NASM on Linux. EDX, ECX, EBX. EAX int 80h [duplicate]汇编语言 x86 - 在 Linux 上使用 NASM。 EDX、ECX、EBX。 EAX int 80h [重复]
【发布时间】:2018-09-28 22:16:08
【问题描述】:

这是我教授给的一段汇编语言代码 我。你能告诉我它是如何工作的吗?特别是“int 80h”部分。我已经在网上寻找答案,但对我来说真的没有意义。

section .data string: db "Hello World", 0x0a 
len:     equ $ - string

section .text 
global main 
main:
       mov edx, len
       mov ecx, string
       mov ebx, 1
       mov eax, 4
       int 80h
       cmp eax, 0        
       je go

go:
       xor ebx, ebx
       mov eax, 1
       int 80h

我知道 edx、ecx 等是寄存器位置,但是我不明白它是如何替代的。

我知道 mov 是 move 的助记符,je 是 jump 如果等于,但其余部分有点超出我的舒适区。

我的教授已经把我们推到了这里,想知道谁能先解决这个问题,所以我们总是感谢任何帮助。

【问题讨论】:

  • 您的教授正在获得报酬来教您。可能会跟他提这个问题。无论如何,对于这样一个 hello world 有很多解释,但这里有一个快速版本:int 80h 是对操作系统的服务请求。它查看寄存器中的内容以确定要做什么。 eax 持有又名功能代码。系统调用号,在第一种情况下是4,对于write。其余的都是论据。第二个是exit。因此代码执行write(1, string, 12); exit(0);
  • cmp/je 在这里完全没用,也是错误的,因为write 返回的是字节数而不是状态码。
  • 寄存器不能替代...不知道你怎么看它们,但它们实际上是相当物理的,eax 在 CPU 芯片上是 32 位(0 或 1 个逻辑值)(背面在早期的 x86 CPU(如 80386)中,CPU 内部只有一个物理 eax,现代 CPU 更复杂,但您仍然可以在编程时这样考虑)。你不能用它代替任何东西,它很简单,并且一直包含一些 32 0/1 值的模式,因为 CPU 已启动。通过mov,您可以直接更改该位模式,例如mov eax, 4 会将这32 个单元格设置为00...00100。
  • 你的教授给了你一个作业。被抛入深渊是该任务的一部分。如果我们先帮你弄清楚,你就作弊了,因为你不是第一个发现的——我们是。如果您不想诚实地努力自己完成它,那就不要费心去做;让真正首先弄清楚的人获得这样做的功劳。
  • 我在What parts of this HelloWorld assembly code are essential if I were to write the program in assembly? 上的回答的第二部分在 NASM 中具有相同的 i386 Linux 代码,只是变量名不同。它对进行系统调用时发生的事情有相当完整的解释。 (除了我的没有无用的分支。sys_write 返回字节数或负数-errno。如果是,分支目标无论如何都是下一条指令,所以采取和不采取去同一个地方.).

标签: assembly x86 x86-64 system-calls mnemonics


【解决方案1】:

首先你应该查看 x86 system_call。然后你就可以理解主函数了。 第一行中的“Hello world”设置为字符串值。第二行计算变量的长度,然后使用系统调用将消息打印到屏幕上。如果操作失败,程序跳转到“go”并使用“mov eax,1”调用system_exit。最后“int 80h”表示调用内核

【讨论】:

  • 您对cmp/je 的解释不太正确。分支目标是下一条指令,所以无论是否采用,下一条要执行的指令始终是go:之后的指令。而cmp eax,0 不是您检查sys_write 故障的方式:Linux 系统调用错误代码是-1..-4095sys_write 如果什么也没写,显然可以返回 0,但我认为只有通过 count=0 才有可能。 man7.org/linux/man-pages/man2/write.2.html#RETURN_VALUE
猜你喜欢
  • 1970-01-01
  • 2020-03-10
  • 2016-02-09
  • 2011-02-02
  • 2012-05-21
  • 2013-07-23
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
相关资源
最近更新 更多