【发布时间】:2014-03-27 01:43:21
【问题描述】:
我有一个关于汇编编程的一般性问题。
在编写高级语言时,编译器采用复杂的高级指令并将它们分解为一堆二进制的机器级指令。
Assembly 不需要这个,因为你是用机器代码编写的。
但是,您实际上是如何将您编写的代码转换为二进制文件的呢?我的意思是你显然是在文本编辑器中写作。你用什么将这些指令放入二进制程序中?
【问题讨论】:
标签: assembly
我有一个关于汇编编程的一般性问题。
在编写高级语言时,编译器采用复杂的高级指令并将它们分解为一堆二进制的机器级指令。
Assembly 不需要这个,因为你是用机器代码编写的。
但是,您实际上是如何将您编写的代码转换为二进制文件的呢?我的意思是你显然是在文本编辑器中写作。你用什么将这些指令放入二进制程序中?
【问题讨论】:
标签: assembly
Assembly 不需要这个,因为你是用机器代码编写的。
实际上,除非您输入十六进制或二进制数字,否则您不是在使用机器语言进行编程。汇编语言是底层机器代码(例如53 32 01)的符号表示(例如mov $1, %eax)。程序集到机器代码通常是一对一的映射,但并非总是如此。
关于如何将你的汇编语言转换成CPU可以运行的机器码,你用的是汇编器,它基本上只是一个汇编语言的“编译器”。
例如,您可以查看 Microsoft 的 masm、Netwide 汇编器 nasm、GNU 自己的 gas 和 many, many more。
举个例子,这里是一个显示如何组装一个短程序的成绩单(可能有问题,我实际上并没有尝试链接和运行它,但这与我试图在这里表达的观点无关)。首先,让我们展示一下汇编源代码:
pax> cat testfile.nasm
section .text
mov ah, 09h ; int 21/09 write string
mov dx, msg
int 21h
mov ax, 4c00h ; int 21/4c exit
int 21h
section .data
msg: db 'Hello, world.'
db 10, '$'
然后我们将它与nasm 组装起来,并向您展示生成的目标文件:
pax> nasm -f elf testfile.nasm
pax> objdump -ds testfile.o
testfile.o: file format elf32-i386
Contents of section .text:
0000 b40966ba 0000cd21 66b8004c cd21 ..f....!f..L.!
Contents of section .data:
0000 48656c6c 6f2c2077 6f726c64 2e0a24 Hello, world..$
Disassembly of section .text:
00000000 <.text>:
0: b4 09 mov $0x9,%ah
2: 66 ba 00 00 mov $0x0,%dx
6: cd 21 int $0x21
8: 66 b8 00 4c mov $0x4c00,%ax
c: cd 21 int $0x21
可以看到汇编源文件已经被翻译成等效的机器码。 objdump 程序已为您将其反汇编为汇编语言,但实际的机器代码只是 .text 部分中的二进制信息:
b4 09 66 ba 00 00 cd 21 66 b8 00 4c cd 21
【讨论】: