第五章 内存地址的操作
立即数取址 [constant]
通用寄存器取址 [bx]
索引寄存器取址 [si] [di]
通用寄存器加上常数进行取址[bx+constant]或者constant[bx]
通用寄存器加上索引寄存器进行取址 [bx+si]或者[bx+di],或者[bx][si] 或者[bx][di]
通用寄存器加上索引寄存器加上常数进行取址[bx+si+constant]
还可以利用逻辑语句,开启或者关闭特殊的地址位,
AND AX,LOGIC_OPERAND
LOGIC_OPERAND中含有0的为关闭该地址位,含有1的为保持该地址位。
OR AX,LOGIC_OPERAND
LOGIC_OPERAND中含有0的为保持该地址位,含有1的为开启该地址位。
字符序列转化为8位的ASCII码,存于内存中,特殊的有‘0’-30H ‘A’ -41H ‘a’ -61H
大小写转化可以用AND OR 进行转化。
可以利用LOOP与[BX]实现二维数组的遍历
处理数据需要解决两个问题:
处理数据在什么地方/处理数据有多长,这些对于任何处理机都是同样面临的问题。
访问位置由前述所给出;
处理数据可以由目的寄存器类型指出,也可由操作符 X PTR 指出,例如:
WORD PTR [ram] BYTE PTR [ram]
还有一种,指令已经指明操作数的大小 PUSH POP
补充的操作指令:
DIV B8/B8 B16/B16 B16/B8 B32/B32 B32/B16 B32/B8
除数放在reg或者内存中
被除数放在AX中,如放置不下,则高位放在DX,低位放在AX
结果:除数如为8位,则AL放置商,AH放置除数
除数如为16位,则AX存放商,DX存放余数
格式为: DIV REG 或者 DIV [RAM] 或者 DIV BYTE PTR DS:[BX+SI+0]
MUL B8*B8 B8*B16 B16*B16
一个乘数放置于寄存器或者内存中,另一个乘数 如果是8位,放置在AL;如果是16位,放在AX中
结果:默认放置在AX中,如果是16位乘法,高位放置在DX,低位放在AX中
格式: MULREG 或者 MUL [RAM] 或者 MUL BYTE PTR [BX+SI+0]
DUP 复制连续数据,可用于预留数据空间 格式: DB 3 DUP(?)
第六章 转移指令
可以修改IP 或者可以修改CS和IP的指令统称为转移指令。
OFFSET 取得标号的偏移地址
JMP 无条件转移指令,可以修改IP,也可以修改CS和IP
JMP指令对应的机器码记录了需要跳转的距离(向后跳转用补码表示)
CALL /RET指令实现子程序。
RET用栈中的数据修改IP,RETF用栈中的指令修改CS和IP。
即,RET 等效于 POP IP——IP=SS:SP SP=SP+2
RETF 等效于 POP CS POP IP——CS=SS:SP SP=SP+2 IP=SS:SP SP=SP+2
CALL指令 将当前IP或CS压栈,进行转移 相当于
PUSH IP
JMP NEAR PTR [LABEL]
编写子程序就是要实现CALL与RET的相互配合使用,而对于参数传递问题,将使用寄存器或者内存来辅助传递参数,或者利用栈来实现参数传递。对于寄存器冲突问题,可以使用栈先保存原程序的寄存器内容
对于条件跳转指令,需要借助于标志寄存器中特定位的值。该寄存器可以保存相关指令的执行结果,可以为CPU执行指令提供依据,可以控制CPU的相关工作方式。
假设有数有N位,
注意SF为记录有符号数的符号位,即第N-1位
CF记录无符号数的进位,即无符号数运算的溢出,即第N位
OF记录有符号数运算的溢出
在CMP比较中,OF=1,溢出,说明实际大小与表观大小相反
SF=0说明前者大于后者
条件跳转指令:
指令 跳转条件
JNZ CF=0
JZ CF=1
JA CF=0
JB CF=1
JG OF=0&SF=0 或者 OF=1&SF=1
JL OF=0&SF=1 或者 OF=1&SF=0
寄存器的状态可以利用PUSHF和POPF指令进行压栈、出栈操作