【发布时间】: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 如果等于,但其余部分有点超出我的舒适区。
我的教授已经把我们推到了这里,想知道谁能先解决这个问题,所以我们总是感谢任何帮助。
【问题讨论】:
-
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