编写汇编代码入门

我一直很害怕汇编语言,我认为这很难理解。 但是最近,因为我在内核上学习了一些汇编语言。 实际上并不那么可怕。

在这篇文章中,我将指导您如何编写汇编代码,更重要的是,如何在Mac上使用模拟器运行它。

我们将采用的方法是:

  1. 在文本编辑器中编写汇编代码
  2. 编译成二进制文件
  3. 使用CPU仿真器(例如qemu)将二进制文件作为磁盘映像运行

这将起作用,因为仿真器将读取二进制文件中的代码作为引导扇区。 引导扇区是磁盘上的前512个字节。 通过使用512字节的二进制代码(来自汇编语言)生成磁盘映像,仿真器将从磁盘中的代码读取到内存中并执行它们。

让我们开始吧。

首先,请安装qemu。 您的另一个选择是bochs,但在Mac上却没有成功。

  #如果尚未安装自制软件,请先安装。 
brew install qemu

其次,创建一个名为boot_sect.asm的文件,并将其复制到:

  ; 做加法 
斧头,4
mov bx,1
加bx,ax
mov al,bl; 打印号码
mov ah,0x0e
加人48
整数0x10
jmp $; padding 0,以便程序的总长度为512字节乘以510-($-$$)db 0; 引导扇区协议指定必须以这2个字节结尾
dw 0xaa55

然后,您需要对其进行编译。 您需要安装nasm。

  brew安装nasm 

现在,您可以运行以下命令将汇编文件编译为二进制文件:

  nasm boot_sect.asm -f bin -o boot_sect.bin 

完成后,您的磁盘上将具有boot_sect.bin。

最后,让我们使用qemu模拟器运行引导扇区代码:

  qemu-system-i386 -fda boot_sect.bin 

您将看到一个这样的窗口:

现在您已运行该程序,让我们深入了解该汇编程序如何工作。

汇编语言可以直接在处理器内部操纵寄存器。 在处理器内部,有许多寄存器,每个寄存器可能包含一个“字”。 一个字可以是2个字节或4个字节,具体取决于模式。 什么模式? 当您启动计算机时,实际上它以16位模式启动,然后切换到32位。

在16位中,每个寄存器实际上是2个字节,一个“较高”字节和一个“较低”字节。

因此,上述方法注册一个低字节。

 斧头 

斧的意思是,登记一个整体。 由于整数4仅占用一个字节,尽管您已指定将其整体存储在寄存器中,但实际上它存储在寄存器的低字节位置。

 寄存器的组织:[高字节] [低字节] 

  mov 

此处mov表示将值移入寄存器。

所以

 斧头,4 

表示将整数4移动到寄存器a中。 由于4仅占用1个字节,因此它实际上被放置为al或寄存器a的低字节。 现在寄存器a的值为0000 b100。 或以二进制形式000000000 00000100。

 加bx,ax 

表示将b和a中的值相加,然后将结果放入b中。

其余代码

  ; 打印号码 
mov ah,0x0e
加人48
整数0x10
jmp $
; 填充0,以便程序的总长度为512字节
倍510-($-$$)db 0
; 引导扇区协议指定必须以这2个字节结尾
dw 0xaa55

实际上是用于使用BIOS内部的代码,该代码在计算机启动时已存储在内存中,有关更多信息,请参见此处,以了解其工作方式和更多汇编语言。

祝贺您的第一个汇编程序!