- 基本概念
电子计算机的最小信息单位是bit,也就是一个二进制位。8个bit组成一个Byte,也就是一个字节。
总线从逻辑上分为3类,地址、控制和数据总线。
典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。
8086 CPU有14个寄存器,每个寄存器有一个名称,分别是AX,BX,CX,DX,SI,DI,SP,BP,CS,SS,DS,ES,PSW。
AX可以分为AH和AL,同理BX,CX,DX。
汇编语句不区分大小写。
- 8086寻址模式
8086寻址模式:段地址X16+偏移地址=物理地址。
本质含义:CPU在访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
基础地址+偏移地址=物理地址
偏移地址为16位,长度最大为64KB。
- 段寄存器
CS和IP是8086中最关键的寄存器。CS为代码段,IP为指令指针寄存器。
8086加点启动或复位后,CS和IP设置为CS=F000H,IP=FFFFH。
通过jmp命令可以同时修改CS、IP内容。
- Debug调试
Debug是Dos,Windows提供的实模式程序的调试工具。可以查看CPU各寄存器中的内存、内存情况和在机器码级别跟踪程序的运行。
win7 64位没有debug功能,dos模拟器即DOSBOX,debug.exe。需要下载,链接如下:
http://www.dosbox.com/download.php?main=1
运行dosbox模拟器。
挂载,mount c d:\
切换到c盘, c:
运行debug命令即可。(debug.exe需要自己从网上下载,然后放到D盘)
R查看修改CPU寄存器内存
D查看内存中内容
E改写内存中内容
U将内存中指令翻译成汇编
T执行一条机器指令
A以汇编指令的格式在内存中写入一条机器指令
改变AX寄存器内容如下:
查看内存中内容
可以用“ d 段地址:偏移地址”
修改内存内容
通过U查看内存中汇编指令
[…]表示一个内存单元。[…]中0表示内存单元偏移地址。指令执行时,8086CPU自动取ds中数据为内存单元的段地址。
8086不支持直接将数据传入到段寄存器中,ds是一个段寄存器,mov ds,1000H是非法的。
- 数据移动
Mov指令有几种形式:
Mov 寄存器,数据
Mov 寄存器,寄存器
Mov 寄存器,内存单元
Mov 内存单元,寄存器
Mov 段寄存器,寄存器
Mov 段寄存器,内存单元
Mov 寄存器,段寄存器
- 栈
栈有两个基本操作:入栈和出栈。栈的操作规则为LIFO(Last In First Out,后进先出)
栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。
不能直接向段寄存器SS送入数据,需要用其他寄存器中转。
Push,pop实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据。
Push指令是先: SP=SP-2,然后向SS:SP指向的字单元中送入数据。
POP指令是:SP:SP指向的字单元中读取数据;SP=SP+2
16位寄存器最大的栈大小为64KB。
- 汇编编写
汇编语言源程序中,有两种指令,一种是汇编指令,一种是伪指令。汇编指令是有对应的机器码的指令,可以被便以为机器指令。伪指令没有对应的机器指令,最终不被CPU所执行。
Segment和ends是一对成对使用的伪指令。
一个有意义的汇编程序至少要有一个段,用来存放代码。
Assmue伪指令的含义为“假设”。假设段寄存器和程序中的某一个用segment…ends定义的段相关联。
伪指令由编译器来处理。
-
- 测试代码
代码如下:
assume cs:codesg
codesg segment
start: mov ax.0123H
mov bx,0456h
add ax,bx
add ax,ax
mov ax,4c00h
int 21h
codesg ends
end
-
- 编译
使用masm 615版本进行编译。
输入:masm hello.asm
编程生成hello.obj目标文件。
得到目标文件后,需要对目标文件进行连接,得到可执行文件。
输入:link
然后根据提示输入文件名字。
生成.exe文件。
-
- 可执行文件装载原理
要运行程序P1,需要程序P2将P1加载到内存中,然后CPU控制权交给P1,P1执行完后将控制权还给P2。
- debug跟踪进程
debug可以将程序加载到内存,设置CS:IP指向程序入口,但是DEBUG不放弃对CPU的控制,这样可以使用debug相关命令来单步执行程序。
例如:debug hello.exe
然后可以用命令进行调试。例如用T进行单步执行。