汇编入门

寄存器

CPU里有名为寄存器的存储电路,在机器语言中相当于变量的功能。具有代表性的寄存器如下,

  • AX - accumulator, 累加寄存器
  • CX - counter, 计数寄存器
  • DX - data,数据寄存器
  • BX - base,基址寄存器
  • SP - stack pointer,栈指针寄存器
  • BP - base pointer,基址指针寄存器
  • SI - source index,源变址寄存器
  • DI - destination index,目的变址寄存器

这些寄存器都是16位的。X这个字符表示extend,意为这些寄存器由8位扩展到了16位。

除了这8个16位寄存器之外,cpu还有8个8位寄存器,

  • AL - accumulator low, 累加寄存器低位
  • AH - accumulator high,累加寄存器高位
  • BL - base low,基址寄存器低位
  • BH - base high,基址寄存器高位
  • CH - counter high,计数寄存器高位
  • CL - counter low,计数寄存器低位
  • DL - data low,数据寄存位低位
  • DH - data high,数据寄存器高位

顺便提一下,在这些寄存器中数据存储都使用的是小端法,为什么使用小端法,可以参考(字节序探析:大端与小端的比较)[https://www.ruanyifeng.com/blog/2022/06/endianness-analysis.html]

段寄存器 - segment register
以下段寄存器均为16位,

  • ES - extra segment,附加段寄存器
  • CS - code segment,代码段寄存器
  • SS - stack segment,栈段寄存器
  • DS - data segment,数据段寄存器
  • FS - segment part 2,没有名称
  • GS - segment part 3,没有名称

32位寄存器

  • EAX
  • ECX
  • EDX
  • EBX
  • ESP
  • EBP
  • ESI
  • EDI

E仍然是Extend的含义,标识从16位扩展到了32位

有64位寄存器吗?

当然是有的,请参考(64位和32位的寄存器和汇编的比较)[https://blog.csdn.net/qq_29343201/article/details/51278798],但是作为汇编学习入门,我们一般使用16位寄存器来学习。

汇编入门

先看一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
entry:
MOV AX,0 ; 初始化寄存器
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX

MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1 ; 给SI加1
CMP AL,0
JE fin
MOV AH,0x0e ; 显示一个文字
MOV BX,15 ; 指定字符颜色
INT 0x10 ; 调用显卡BIOS
JMP putloop
fin:
HLT ; 让CPU停止,等待指令
JMP fin ; 跳转到fin继续执行,即无限循环

msg:
DB 0x0a, 0x0a ; 换行2次
DB "hello, world"
DB 0x0a ; 换行
DB 0

RESB 0x7dfe-$

DB 0x55, 0xaa

MOV

MOV的含义是赋值

1
MOV AX,0

表示将0赋值给AX(累加寄存器),相当于AX=0。

1
MOV SI,msg

标识将msg赋值给SI(源变址寄存器)。这里的msg就是下文的msg标号,代表了一段汇编程序。赋值后,msg所在地址(不是内存中的地址,而是cpu中的存储)就会被赋值给SI,后续其他代码就可以直接使用了。

1
MOV AL,[SI]

这里的方括号[SI],指的是内存中的SI。内存指的是主板上的内存设备。

MOV指令的数据传送源和传送目的地不仅可以是寄存器或常数,也可以是内存地址。

1
2
MOV BYTE [678],123
MOV WORD [678],123

这个指令是要用内存的“678”号地址来保存“123”这个数值。使用BYTE时,只有678号地址中的数据会有反应(8位),而使用WORD时,678,679号地址中的数据都会做出反应(16位)。

这里要提到一点,

对于16位机器来说吗,1字等于2字节,1字节等于8位,即1字等于16位。但在8位机器中,1字仍然时1字节。(32位中,1字=4字节)。

ADD

ADD是加法指令。ADD SI,1即为SI=SI+1

CMP

CMP源自compare,意为比较。CMP AL,0就是将AL中的值和0进行比较。

JMP

跳转

JE - jump if equal