我对汇编编程有一般性的疑问。
编写高级语言时,编译器会将复杂的高级指令分解为一堆二进制的机器级指令。
由于您正在使用机器代码编写,因此程序集不需要此功能。
但是你如何真正得到你写入二进制文件的代码?我的意思是你显然是在文本编辑器中写作。你用什么来将这些指令放入二进制程序?
答案 0 :(得分:5)
由于您正在使用机器代码编写,因此程序集不需要此功能。
实际上,除非您输入十六进制或二进制数字,否则您不会使用机器语言进行编程。汇编语言是底层机器代码的符号表示(例如,mov $1, %eax
)(例如,53 32 01
)。通常是汇编到机器代码的一对一映射,但并非总是如此。
关于如何将汇编语言转换为CPU可以运行的机器代码,您可以使用汇编程序,它基本上只是一个"编译器"汇编语言。
例如,您可以查看Microsoft的masm
,Netwide汇编程序nasm
,GNU自己的gas
和many, many more。
举例来说,这里的成绩单显示了如何组装一个简短的程序(可能有错误,我实际上还没有试图链接和运行它,但这与I&#无关) 39;我试图穿过这里)。首先,让我们展示汇编源代码:
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