汇编入门
寄存器
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 | entry: |
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 | MOV BYTE [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