汇编语言基本语句
寻址方式:
[idata]
[BX]与寄存器间接寻址
[BX/SI/DI+idata]
[BX+SI/DI]
[BX+SI/DI+idata]
这些寻址方式可以分别对应于, 一维数组, 二位数组, 结构体, 结构体数组的寻址等。 即在一定程度上, 汇编语言已经为高级语言提供了各种结构的原理和基础。
INC指令
格式:inc 操作数
▫功能:将操作数的值加1
▫说明:操作数可以是寄存器,也可以是内存单元
DEC指令
格式:dec 操作数
功能:将操作数的值减1
说明:操作数可以是寄存器,也可以是内存单元
AND :逻辑与指令
格式:AND 目的操作数,源操作数
操作:按位进行与运算,结果放到目的操作数
例如: mov al, 01100011B
and al, 00111011B
执行后 (AL)=00100011B
OR :逻辑或指令
格式:OR 目的操作数,源操作数
操作:按位进行或运算,结果放到目的操作数
例如: mov al, 01100011B
or al, 00111011B
执行后 (AL)=01111011B
NOT:逻辑非(按位取反)
格式:NOT 操作数
功能:按位进行非运算
例如: mov al, 01100011B
not al
执行后, (AL)=10011100B
XOR:逻辑异或(相同为0,不同为1)
格式:XOR 目的操作数,源操作数
功能:按位进行异或运算
例如: mov al, 01100011B
xor al, 00111011B
执行后, (AL)=01011000BSI为源变址寄存器,DI为目的变址寄存器,一般用于串处理操作。
SI和DI不能分成两个8 位寄存器来使用,但可以和BX一样,实现寄存器间接寻址。
B80100 |
mov ax, 1 |
CPU内部,指令缓冲器中 |
89D8 |
mov ax, bx |
CPU内部,BX寄存器中 |
A10000 |
mov ax, ds:[0] |
内存DS:0字单元 |
58 |
pop ax |
内存SS:IP字单元 |
E520 |
in ax, 20H |
20H端口 |
BP:基址指针寄存器,用作内存单元寻址时和BX类似,但默认段地址在SS中,可以用来直接存取堆栈中的数据。
说明:在[…] 中,BX、SI、DI、BP可以单个出现,或只能以BX+SI、BX+DI、BP+SI、BP+DI四种组合形式出现。
DIV指令
格式:DIV REG/MEM(除数)
功能:用显式操作数去除隐含操作数,商和余数按下表的对应关系存放。
除数位数 |
被除数 |
商 |
余数 |
8 |
AX |
AL |
AH |
16 |
DX-AX |
AX |
DX |
例如:
div bx
div bl
div byte ptr ds:[0]
div word ptr es:[0]
转移指令与程序逻辑控制
操作符OFFSET
无条件转移指令JMP
段内直接短/近转移
段间直接远转移
段内/段间间接转移
条件转移指令JCXZ
汇编语言的程序逻辑控制主要通过修改CS、IP寄存器值实现,对应指令统称为转移指令。
无条件转移指令JMP
条件转移指令,如JCXZ
循环指令,如LOOP
过程调用、中断
名称 |
格式 |
段内直接短转移 |
JMP SHORT 标号 |
段内直接近转移 |
JMP NEAR PTR 标号 |
段间直接远转移 |
JMP FAR PTR 标号 |
段内间接转移 |
JMP 16位寄存器 JMP WORD PTR 内存单元地址 |
段间间接转移 |
JMP DWORD PTR 内存单元地址 |
LOOP循环程序框架
mov cx,循环次数
s: 循环执行的程序段
;;;;;;;
loop s
一段安全的内存空间
在一般PC机的DOS方式下,DOS和其它合法程序一般都不会使用0:200~0:2FF的256 个字节的内存空间,所以使用这段空间是安全的。
RET指令:用栈中的数据修改IP的内容,从而实现近转移。
(IP):=((SS)*16+(SP)) ;POP IP
(SP):=(SP)+2
RETF指令:用栈中的数据修改CS和IP的内容,实现远转移。
(IP):=((SS)*16+(SP)) ;POP IP
(SP):=(SP)+2
(CS):=((SS)*16+(SP)) ;POP CS
(SP):=(SP)+2
CALL指令的执行过程为:
将当前的 IP 或 CS和IP 压入栈中;
转移。
根据转移距离和是否使用标号,CALL指令具有如下形式:
CALL 标号
CALL FAR PTR 标号
CALL reg
CALL WORD PTR mem
CALL DWOED PTR mem
说明:CALL指令不能实现短转移。
标志寄存器(FLAG):8086 CPU的标志寄存器共16位,其中存储的信息通常被称为程序状态字(PSW)。
其他寄存器是用来存放数据的,整个寄存器具有一个含义;FLAG是按位起作用的,它的每一位都有专门的含义,记录特定的信息。
FLAG寄存器的作用:
存储相关指令的某些执行结果;
为CPU执行相关指令提供行为依据;
控制CPU的相关工作方式。
标志位 |
取值为1的标记 |
取值为0的标记 |
OF |
OV |
NV |
DF |
DN |
UP |
SF |
NG |
PL |
ZF |
ZR |
NR |
PF |
PE |
PO |
CF |
CY |
NC |
ZF标志
类型:状态标志。
功能:记录相关指令执行后,结果是否为0,若结果为0,ZF=1,否则ZF=0。
PF标志
类型:状态标志。
功能:记录相关指令执行后,结果的所有二进制位中1的个数是否为偶数,是则PF=1,否则PF=0。
SF标志
类型:状态标志。
功能:它记录相关指令执行后,有符号运算结果是否为负,若结果为负,则SF=1,否则SF=0。
CF标志
类型:状态标志。
功能:在进行无符号数运算的时候,CF记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
DF标志
类型:控制标志。
功能:在串处理指令中,控制每次操作后SI、DI的递变方式(同增或同减)。
DF=0,每次操作后SI、DI递增
DF=1,每次操作后SI、DI递减
ADC指令
格式:ADC 操作对象1,操作对象2
功能:
带进位加法指令 ,利用了CF位记录的进位值;
操作对象1=操作对象1+操作对象2+CF。
说明:
在8086CPU的指令集中,有的指令的执行会影响FLAG,如ADD、SUB、MUL、DIV、INC、OR、AND等,它们大都是运算指令,进行逻辑或算术运算;
有的指令的执行对FLAG没有影响,如MOV、PUSH、POP等,它们大都是传送指令。
在使用一条指令的时候,要注意这条指令的全部功能,包括执行结果会对FLAG的哪些标志位造成影响。
SBB指令
格式:SBB 操作对象1,操作对象2
功能:
带借位减法指令 ,利用了CF位记录的借位值;
操作对象1=操作对象1-操作对象2-CF。
PS: Intel 格式的汇编码和ATT格式的汇编码略有不同。 例如 Intel中的 mov 是 ATT 中的 movl 等。
ATT 是根据 AT&T(美国电话电报公司)命名的,AT&T运营贝尔实验室多年, 贝尔实验室是历史上最大, 最成功的私有实验室。 在这里, 著名的发明除了电话,还有射电天文望远镜, 晶体管, 数字交换机, C语言, Unix操作系统 。 此外还发现了电子波动性, 发明了信息论, 组织发射了第一颗通信卫星, 铺设了第一条商用光纤等。