如何理解可执行文件中的字节并将程序加载到内存中?

时间:2011-07-28 05:52:18

标签: assembly load executable dos

以下是接近我的问题,我仍然缺少一个链接,这将有助于我了解加载过程。

How does DOS load a program into memory?

我的问题是“当我在命令行输入mf.com时,机器会逐步发生什么?”

我正在使用Windows 7,我已经安装了NASM进行编译。 以下是我在其中一个网站上获得的程序集

文件名为mf.asm


org 100h

mov dx,msg mov啊,9

int 21h 保留

msg db“Hello,world!$”


我使用以下命令获取My mf.com文件

  

nasm -f bin mf.asm -o mf.com

现在,我通过输入

来运行mf.com
  

mf.com

我得到了结果 你好,世界!$

我在textpad中打开了mf.com二进制文件,它显示如下。


   0: BA 08 01 B4 09 CD 21 C3  48 65 6C 6C 6F 2C 20 77  ********Hello, w
  10: 6F 72 6C 64 20 21 24                              orld !$

********是文本编辑中显示的相应角色。

当我在命令行输入mf.com并点击回车时,机器会逐步发生什么? 特别是“BA 08 01 B4 09 CD 21 C3”如何使用这8个字节?

2 个答案:

答案 0 :(得分:1)

字符BA 08 01 B4 09 CD 21 C3 48 65 6C 6C 6F 2C 20 77是机器代码。它们将被翻译成汇编指令。从您的程序中,它们是以下代码的翻译:

mov dx, msg mov ah, 9

int 21h ret

因此,简而言之,这8个字节会导致在您的处理器中执行MOVINT指令。 MOV指令复制DX寄存器中的存储单元地址,其中包含字符串“Hello World!$”。

答案 1 :(得分:1)

这些是表示指令本身的字节,前缀字节(我相信最多4个),主操作码(1或2),可选的MODRM和SIB字节,位移字节,最后是立即操作数(如果有的话)。机器根据指令的前缀和主操作码解释这些字节。如果你真的想知道你可以找到能够显示二进制文件的表格。

处理器不会将指令解释为助记符,助记符只是它们的代码,因此您更容易编写代码。编译器将这些助记符更改为计算机可以理解的字节码或原始二进制数据。硬件从那时起接管。