写入正在运行的汇编程序

时间:2014-03-27 01:43:21

标签: assembly

我对汇编编程有一般性的疑问。

编写高级语言时,编译器会将复杂的高级指令分解为一堆二进制的机器级指令。

由于您正在使用机器代码编写,因此程序集不需要此功能。

但是你如何真正得到你写入二进制文件的代码?我的意思是你显然是在文本编辑器中写作。你用什么来将这些指令放入二进制程序?

1 个答案:

答案 0 :(得分:5)

  

由于您正在使用机器代码编写,因此程序集不需要此功能。

实际上,除非您输入十六进制或二进制数字,否则您不会使用机器语言进行编程。汇编语言是底层机器代码的符号表示(例如,mov $1, %eax)(例如,53 32 01)。通常是汇编到机器代码的一对一映射,但并非总是如此。

关于如何将汇编语言转换为CPU可以运行的机器代码,您可以使用汇编程序,它基本上只是一个"编译器"汇编语言。

例如,您可以查看Microsoft的masm,Netwide汇编程序nasm,GNU自己的gasmany, 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