汇编语言
主要知识点来自《汇编语言》速成指南(全程敲代码),配套材料:
- 王爽老师的《汇编语言》
- 使用DOSbox模拟运行8086CPU汇编语言
如有错误,欢迎指正!
1. 入门
简单引入关于8086CPU的知识。
CPU内部主要由运算器、控制器、寄存器三大部分组成[1]。
运算器: 负责算术运算(+ - * / 基本运算和附加运算)和逻辑运算(包括 移位、逻辑测试或比较两个值等)。
控制器: 负责应对所有的信息情况,调度运算器把计算做好。
寄存器: 它们可用来暂存指令、数据和地址。既要对接控制器的命令,传达命令给运算器;还要帮运算器记录处理完或者将要处理的数据。
8086 CPU 中寄存器总共为 14 个,且均为 16 位[2]。它们分为:
通用寄存器
-
AX,BX,CX,DX称作为数据寄存器:
- AX (Accumulator):累加寄存器,也称之为累加器;
- BX (Base):基地址寄存器;
- CX (Count):计数器寄存器;
- DX (Data):数据寄存器;
-
SP和BP又称作为指针寄存器:
- SP (Stack Pointer):堆栈指针寄存器;
- BP (Base Pointer):基指针寄存器;
-
SI和DI又称作为变址寄存器:
- SI (Source Index):源变址寄存器;
- DI (Destination Index):目的变址寄存器;
控制寄存器:
- IP (Instruction Pointer):指令指针寄存器;
- FLAG:标志寄存器;
段寄存器:
- CS (Code Segment):代码段寄存器;
- DS (Data Segment):数据段寄存器;
- SS (Stack Segment):堆栈段寄存器;
- ES (Extra Segment):附加段寄存器;
其中,通用寄存器和段寄存器是我们最常用的寄存器。8086CPU可以使用H和L来表示寄存器的高8位和低8位,如AX寄存器的高8位为AH,低8位为AL。但是这只针对于AX、BX、CX、DX这四个寄存器,其他的寄存器没有这样的表示方法。
挂载DOSBox的C盘到本地的D:\masm目录
mount c d:\masm\
切换到C盘
c:
查看文件
dir
1.1 使用Debug
debug
R D E U T A
- R: 显示或更改寄存器的内容
- D: 显示内存内容
- E: 修改内存内容
- U: 汇编指令,将机器码转换为汇编指令
- T: 单步执行
- A: 以汇编指令的格式显示内存内容
记忆方法:ture ad
R: read
D: display
E: edit
U: unassemble
T: trace
A: assemble
R 表示显示或更改寄存器的内容
显示:
R
更改
R [寄存器名]
D 表示显示内存内容
D
D指令默认显示内存中的128个字节,从0000开始,每行显示16个字节,每个字节用两个十六进制数表示,每行的最后显示这16个字节对应的ASCII码。
D [地址]
D [地址] [长度]
E 表示修改内存内容,修改内存中的数据
E [地址] [数据]
连续修改内存中的数据,从某个地址开始,修改多个数据
E [地址]
A 表示以汇编指令的格式在内存中写入指令
A [地址]
T 表示单步执行(搭配A使用)
T
U 表示将机器码转换为汇编指令
U [地址]
2.1 常用指令
mov add sub
mov: move,移动,赋值
mov ax, 1
表示将1赋值给ax寄存器,然后ax寄存器的值为1
mov ax, bx
表示将bx寄存器的值赋值给ax寄存器
add: 加法
add ax, 1
表示将ax寄存器的值加1,然后将结果赋值给ax寄存器
add ax, bx
表示将ax寄存器的值加bx寄存器的值,然后将结果赋值给ax寄存器
sub: 减法
sub ax, 1
表示将ax寄存器的值减1,然后将结果赋值给ax寄存器
sub ax, bx
表示将ax寄存器的值减bx寄存器的值,然后将结果赋值给ax寄存器
mul div and or乘除指令及所有寄存器英文名
mul: 乘法
mul [源操作数]
mul指令进行乘法运算有两种形式:
若操作数为8位,则乘数在AL中,被乘数在指定的源操作数中,乘积在AX中。
\[AL \times [源操作数] = AX \]若操作数为16位,则乘数在AX中,被乘数在指定的源操作数中,乘积在DX:AX中。
\[AX \times [源操作数] = DX:AX \]mul [源操作数]
div: 除法
div [源操作数]
div指令进行除法运算有两种形式:
除数为8位,被除数为16位,默认在AX中存放。结果的商在AL中,余数在AH中。
\[AX \div [源操作数] = AL \ldots\ldots AH \]除数为16位,被除数为32位,默认在DX和AX中存放,DX存放高16位,AX存放低16位。结果的商在AX中,余数在DX中。
\[DX:AX \div [源操作数] = AX \ldots\ldots DX \]and: 与运算
and [目的操作数], [源操作数]
or:或运算
or [目的操作数], [源操作数]
参考与注释: