Assume总结 @

概念介绍 @

  • 机器语言,计算机将高低电平转换为 0-1 数字,在 x86 处理器中,指令与数据以同等地位保存在存储器中,每一种微处理器都有机器指令集,也就是机器语言。
  • 存储单元,8086CPU 中,一个字为 2 个字节,一个字节为 8 比特,存储单元包括寄存器、主存、现存等等。
  • 内存地址空间,CPU 通过主板上的总线与各个设备的寄存器以及各存储器相连,在物理上,这些存储器并没有连接在一起,但在逻辑上它们组成一个连续的内存空间,称为内存地址空间。
  • 寄存器,用于信息存储,汇编语言是通过寄存器来实现对 CPU 的控制,8086CPU 的所有寄存器为 16 位。
  • 寻址方法,8086CPU 采用两个 16 位地址合成的方法来形成 20 位的物理地址,一个称为段地址,一个称为偏移地址,实际物理地址=段地址*16+ 偏移地址
  • 中断向量表,当发生中断时,CPU 要执行中断处理程序,而中断处理程序的入口地址是通过中断向量表找到的,也就是说中断向量表也就是各个中断处理程序的入口地址的列表,8086CPU 中,中断向量表放在内存 0 处,从 0:0 到 0:03FF 的 1024 个单元存放中断向量表。
  • 端口及端口地址空间,PC 机系统中,CPU 通过总线和各种芯片相连,包括各种存储器,接口卡上的芯片以及主板上的接口芯片,这些芯片中都有一组可以有 CPU 读写的寄存器,这些寄存器与 CPU 的总线相连,CPU 通过向其芯片发送端口读写命令实现读或写,从 CPU 的角度将这些寄存器都当作端口,进行统一编址,从而建立统一的端口地址空间,每个端口在此空间中都有一个地址。

寄存器 @

8086CPU 中,寄存器有 16 种,分别为 AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW,其中 AX、BX、CX、DX 被称为通用寄存器,用于存放一般性的数据,这四种寄存器可以分成两个独立的 8 位寄存器来使用,例如 AX 可分为 AH 和 AL,BX 可分为 BH 和 BL 等。

  • CS 寄存器,代码段寄存器,存放指令在内存中的段地址

  • IP 寄存器,指令指针寄存器,存放指令在内存某段的具体位置,与 CS 寄存器组合来确定指令在内存的具体位置。

  • DS 寄存器,用于存放数据的短地址,例如 DS:[8],代表段地址保存在 ds 寄存器中,偏移地址为 8,也可以隐式使用,例如写成[8],则默认段地址保存在 DS 寄存器中。

  • ES 寄存器,段地址寄存器,与 DS 功能类似,但必须显式使用.

  • SS 寄存器,栈顶的段地址寄存器

  • SP 寄存器,栈的偏移地址寄存器,与 SS 寄存器组合,始终指向栈顶.

  • CX 寄存器,通常存放循环次数,与 loop 指令联用.

  • SI 寄存器,与 BX 功能相近的寄存器,通常使用 DS:[si]代表数据源

  • DI 寄存器,与 BX 功能相近的寄存器,通常使用 ES:[di]代表目的地址

  • BP 寄存器,与 SI、DI 功能类似,可以在[]中进行内存单元寻址。

  • PSW,标志位寄存器。

    • 标志 1 0
    • OF,OV、NV,是否溢出
    • SF,NG、PL,判断正负
    • ZF,ZR、NZ,是否为 0
    • PF,PE、PO,判断奇偶
    • CF,CY、NC,是否进位
    • DF,DN、UP,方向标志位

指令大全 @

debug 指令,用于实模式 8086 方式的程序调试

  • R 命令查看、修改 CPU 寄存器的内容
  • D 命令查看内存中的内容
  • E 命令改写内存中的内容
  • U 命令将内存中的机器指令翻译成汇编指令
  • T 命令执行一条机器指令
  • A 命令以汇编形式在内存中写入一条机器指令

masm 指令,用于汇编器编译源代码

link 指令,用于连接相关文件形成可执行文件

assume 操作符,用于将标号所在段和一个段寄存器联系起来。

mov 指令,用于数据的移动

mov ax,18    ;将数值18移入ax寄存器
mov al,18    ;将数值18移入al寄存器,也就是ax的低8位

add 指令,用于将数值与寄存器的内容相加,并存入寄存器

add ax,18    ;ax寄存器的内容加18,结果存入ax寄存器
add ax,bx    ;ax的内容与bx的内容相加,结果存入bx寄存器

adc 指令,带进位的加法指令,比 add 指令多加了 CF 位的值。

sub 指令,寄存器的内容与某数值相减,结果存入寄存器

sub ax,ax    ;ax的内容减去ax的内容,结果存入ax

jmp 指令,跳转指令,用于修改 CS 与 IP 实现程序的跳转

jmp 00000010        ;跳转到00000010地址处
jmp short s            ;实现段内段转移,转移到标号s处ip修改范围-128-127
jmp near ptr s        ;段内近转移,(IP)=(IP)+16位位移
jmp far ptr s        ;段间转移,CS为标号所在段的段地址IP是标号在段中的偏移地址
jmp ax                ;修改IP寄存器的值为ax

push 指令与 pop 指令,用于栈操作

push ax        ;ax的值存入栈中
pop  ax        ;将栈顶的数据存入ax中

loop 指令,循环指令,每次循环使 cx 寄存器的值减 1,然后跳到标号处,如果 cx 的值为 0,则循环结束.

loop 标号    ;判断cx的值是否为0,如果不为零则跳转标号处,然后使cx的值自减

inc 指令与 dec 指令,使寄存器的值加一或减一

inc ax        ;使ax的值增1
dec ax        ;使ax的值减1

dw 操作符,用于定义字型数据,db 用于定义字节型数据,dd 用于定义双字型数据

dw 0123h,0456h,0789h
db 11h,12h,13h
dd 01230456h

dup 操作符,用于进行数据的重复

db 128 dup(0)    ;定义了128db型数据,其值都为0

and 指令,逻辑与指令,按位进行与运算

mov al,01100011B
and al,00111011B
al = 00100011B

or 指令,逻辑或指令,按位进行或运算

mov al,01100011B
or al,00111011B
al = 01111011B

div 除法指令,除数有 8 位和 16 位两种,在一个寄存器或内存单元中,被除数默认放在 AX 或 DX 和 AX 中,如果除数为 8 位,被除数为 16 位,放在 AX 中。如果除数为 16 位,被除数为 32 位,DX 存放高 16 位,AX 存放低 16 位。

div reg                    ;AX除reg中的内容
div word ptr es:[0]        ;16位除法
div byte ptr [bx]        ;8位除法

offset 操作符,用于取得标号的偏移地址

mov bx,offset s            ;将标号s的地址给bx寄存器

seg 操作符,用于取得标号所在段地址

jcxz 指令,如果 cx 为零,则跳转

jcxz s            ;如果cx为0,则跳转到s标号处

ret 指令,用栈中数据,修改 IP 的内容,相当于 pop IP

retf 指令,用栈中数据,修改 CS 和 IP 的内容,相当于 pop IP 与 pop CS 指令

call 指令,将 CS 与 IP 压入栈中,然后在转移,通常和 ret 指令配合使用,实现函数功能。

call s        ;CS与IP的值压入栈中,然后跳转到s标号处
s: ret        ;将栈中数据,修改CS与IP的内容,跳到call指令后

mul 指令,乘法指令,两个相乘的数要么都是 8 位,要么都是 16 位,如果是 8 位,一个放在 AL 中,另一个放在 8 位 reg 或内存单元中,结果存放在 AX 中。如果都是 16 位,一个放在 AX 中,另一个放在 16 位 reg 或内存单元中,结果高位在 DX 中,低位在 AX 中。

mul byte ptr ds:[0]        ;8位乘法
mul word ptr [bx]        ;16位乘法

cmp 指令,比较指令,执行后改变标志位寄存器相应位置的值,与下列指令可以配合使用

  • je 指令,等于则转移
  • jne 指令,不等于则转移
  • jb 指令,低于则转移
  • jnb 指令,不低于则转移
  • ja,高于则转移
  • jna 指令,不高于则转移

movsb 指令,将 ds:si 指向的内存单元中的字节送入 es:di 中,然后根据标志寄存器 df 位的值,将 si 和 di 递增或递减,movsw 则是将 si 或 di 递增 2 或递减 2

rep 指令,根据 cx 的值,重复执行后面的传传送指令,通常写法为 rep movsp 或 rep movsw

cld 指令,将标志寄存器 df 置 0

std 指令,将标志寄存器 df 置 1

pushf 指令,将标志寄存器置压栈

popf 指令,从栈中弹出数据,送入标志寄存器

int 指令,中断指令

int n        ;n为中断类型码

iret 指令,中断返回指令,相当于 pop cs,pop ip,popf

shl 指令与 shr 指令,移位指令,shl 将最后移出的位写入 CF,shr 与其相反。

mov al,01001000b
shl al,1
al=10010000b,cf=0

mov al,01001000b
mov cl,2
shl al,cl
al=00100000b,cf=1

mov al,01001000b
shr al,1
al=00100100b,cf=0

sti 命令与 cli 命令,sti 设置 IF 为 1,cli 设置 IF 为 0,如果 IF 为 1,则 CPU 执行完当前指令后响应中断,如果 IF 为 0,则不响应可屏蔽中断.