关于汇编的教程好多,我看的是中山大学的汇编语言,个人爱好,还请朋友多多帮忙,不正确的地方看到请告诉我,谢谢。
一、寄存器
cl寄存器 移位的位数,循环的次数
DX寄存器 做32位乘除法时存放被除数16位 存放余数
SI、DI 多用于字符串的操作
SP:栈顶地址、BP:基址 堆栈指针
标志位:
CF 进位标志
ZF 反应运算结果是否为0,为0则ZF置1
SF 与运算结果的最高位相同,负数。SF=1
OF 溢出标志
PF 奇偶标志:判断低8位1的个数,为偶数置1
AF 辅助进位标志
状态控制标志:
DF 方向标志(串操作)
IF 中断允许标志,IF=1,CPU响应可屏蔽中断
TF 单步标志
2^8=128 FF 2^16=65535 FFFF
二、存储器分段和地址
地址是无符号整数,书写格式为十六进制数
第四节:
数据的存储:
大部分数据都是以字为单元存储的,低对低,高对高。例:(0004)=1234h,则(0004)=34h,(0005)=12h。 字节byte,字word ,双字dword
可以直接寻址1M字节,直接访问的最大存储空间为64K,通过分段(每段64K)来使用1M字节空间
逻辑地址可以代表唯一物理地址 ,指令使用逻辑地址
取指令时,自动引用代码段寄存器CS:IP
取数据时,自动默认到DS:SI、ES:DI取数据
第五节:
寻址方式
寄存器传送:
MOV AX,BX
立即数寻址:
MOV AX,1234
直接寻址:
MOV AX,[1234H]
直接寻址的操作数通常是程序中的变量
间接寻址:
MOV AX, [SI]
MOV AX,ES:[DI]
有效地址在SI、DI、BX中 以DS段寄存器内容为段值。
有效地址在BP中 以SS段寄存器内容为段值
寄存器间接寻址:
MOV AX,[DI+1234H]
第七节:
指令系统:
标号:助记符 操作数 操作数 注释
数据传送指令
MOV DST ,SRC
源操作数和目的操作数类型要一致
** 立即数只能做源操作数,不能直接传送到段寄存器
MOV BX,OFFEST TABLE 把TABLE偏移地址送BX
交换指令
XCHG AL,AH
不包括段寄存器
地址传送指令
LEA REG,OPRD
REG:16位通用寄存器 传送OPRD(存储器操作数)的有效地址
LDS REG,OPRD(32位的存储器操作数)
执行操作:(REG)<---(SRC) 送到SI
(DS) <---(SRC+2) 送到DS
LES REG,OPRD
执行操作:(REG)<---(SRC) 送到DI
(ES) <---(SRC+2) 送到ES
第八节
堆栈操作指令:
堆栈时一段内存区域(RAM)
栈顶是低地址,栈底高地址。
堆栈存取必须以字为单元
PUSH SRC
可以是寄存器和段寄存器,可以是字存储单元
POP DST
可以是寄存器和段寄存器(不能是CS),可以是字存储单元
用作临时保存寄存器内容
第九节
标志操作指令:
(1)标志传送指令
LAHF 标志寄存器的低八位中的CF、PF、AF、ZF、SF送AH低八位指定位0、2、4、6、7
SAHF AH低八位0、2、4、6、7送标志寄存器低八位中的CF、PF、AF、ZF、SF
PUSHF 把16位标志寄存器内容压栈 SP-2 ---> SP
POPF 相反
作用:改变标志位时,保存标志寄存器。例如TF标志
数据交换三种方式: 传送指令、交换指令、堆栈指令
(2)标志位操作指令
CLC 清进位标志指令 CF=0
STC 置进位标志指令 CF=1
CMC 进位标志取反指令 CF=~CF
CLD 清方向标志指令 DF=0向下递增
STD 置方向标志 DF=1向上递减
CLI 清中断允许标志 IF=0 CPU不响应可屏蔽中断
STI 置中断允许标志 IF=1 CPU响应可屏蔽中断
加减运算指令
ADD OPRD1,OPRD2 不带进位加法
ADC OPRD1,OPRD2 带进位加法
INC OPRD 加1指令影响ZF、SF、OF、PF、AF不影响CF
加1指令主要用于调整地址指针和计数器
例:把首地址为BLOCK的字数组的第六个字送到DX
寄存器间接寻址: MOV BX,OFFEST BLOCK
寄存器的相对寻址: MOV DX,[BX+000AH]
第十节
定义TABLE数组中一次存储了七个字数据,紧接着是名为ZERO的字单元
例:
TABLE DW 23,36,2,100,32000,54,0
ZERO DW ?
将数据0送ZERO单元
LEA BX,TABLE
;MOV BX,OFFEST TABLE
MOV AX,[BX+0CH]
MOV ZERO,AX
减法指令
SUB OPRD1,OPRD2 减法指令(OPRD1)<-----(OPRD1-OPRD2)
SBB OPRD1,OPRD2 带借位减法 多用于多字节数相减 SBB AL,DL SBB DX,AX
DEC OPRD 减一指令,同样不影响CF