第九章笔记
1.8086 CPU 的转移行为:只修改IP的段内转移和修改IP和CS的段间转移;根据修改IP的范围分为短转移(-128~127)和长转移(-32768~32767)。
2.8086 CPU 的转移指令:
(a)无条件转移
(b)条件转移
(c)循环
(d)过程
(e)中断
3.伪指令 OFFSET:获得段内标号的偏移地址。如 Mov AX,OFFSET S 是将标号s的偏移地址(立即数)放入AX中
4.JMP 无条件转移指令
(a)段内短转移:JMP SHORT 标号 范围:-128~127 功能:编译时算出8位位移 (IP)=(IP)+ 8位位移
(b)段内近转移:JMP NEAR PTR 标号 范围:-32768~32767 功能:编译时算出16位位移(IP)=(IP)+ 16位位移
JMP WORD PTR 内存单元(字)地址
(c)段间转移:JMP FAR PTR 标号 机器码中包含目的地址。机器码中双字单元的高地址存放转移的段地址,低地址存放偏移地址
JMP WORD PTR 内存单元(双字)地址
5.JCXZ 条件转移指令:当CX等于0时跳转,不等于0时,程序向下执行 范围:-128~127 功能:编译时算出8位位移 (IP)=(IP)+ 8位位移
6.LOOP 循环指令:先将CX减一,不等于0时跳转。范围:-128~127 功能:编译时算出8位位移 (IP)=(IP)+ 8位位移
========================================================================================
9.1监测点
(a)JMP WORD PTR 指令为段内转移,所以只要使[BX+1]处的数据为0,就可以转移到第一句代码
ASSUME DS:DATASG,CS:CODESG
DATASG SEGMENT
DB 16 DUP (0)
DATASG ENDS
CODESG SEGMENT
START: MOV AX,DATASG
MOV DS,AX
MOV BX,0
JMP WORD PTR [BX+1]
MOV AX,4C00H
INT 21H
CODESG ENDS
END START
(b)JMP DWORD PTR 为段间转移,内存地址为双字型数据,高16位为段地址,低16位为偏移地址
ASSUME DS:DATASG,CS:CODESG
DATASG SEGMENT
DD 12345678H
DATASG ENDS
CODESG SEGMENT
START: MOV AX,DATASG
MOV DS,AX
MOV BX,0
MOV [BX],BX
MOV [BX+2],CS
JMP DWORD PTR DS:[0]
MOV AX,4C00H
INT 21H
CODESG ENDS
END START
(c)CS=0006H,IP=00BE
9.2检测题
将CX置为0,从2000:0处开始遍历,将每个字节和CL进行或运算,结果为0则执行JCXZ
ASSUME CS:CODESG
CODESG SEGMENT
START: MOV AX,2000H
MOV DS,AX
MOV BX,0
S: MOV CX,0
OR CL,[BX]
JCXZ OK
INC BX
JMP SHORT S
OK: MOV DX,BX
MOV AX,4C00H
INT 21H
CODESG ENDS
END START
9.3监测点
LOOP指令会先将CX减一,然后判断出现CX是否为0,所以先将CX加一
ASSUME CS:CODESG
CODESG SEGMENT
START: MOV AX,2000H
MOV DS,AX
MOV BX,0
S: MOV CX,0
OR CL,[BX]
JCXZ OK
INC BX
JMP SHORT S
OK: MOV DX,BX
MOV AX,4C00H
INT 21H
CODESG ENDS
END START
实验8
分析:
START标识了程序的入口,从START的代码开始执行,代码段前2条不会执行
ASSUME CS:CODESG
CODESG SEGMENT
MOV AX,4C00H
INT 21H
START: MOV AX,0 ;START标识了程序的入口,从START的代码开始执行,代码段前2条不会执行
S: NOP
NOP
MOV DI,OFFSET S ;这四句代码将S2处的 JMP SHORT S1(机器码:EBF6,偏移量F6为-10的补码),复制到S处
MOV SI,OFFSET S2
MOV AX,CS:[SI]
MOV CS:[DI],AX
S0: JMP SHORT S ;段内短转移到 S处,此时S处的代码为 EBF6,此时 IP=8 跳转后的ip = (8- 10)=-2,超出代码段地址,跳转到0,程序结束
S1: MOV AX,0
INT 21H
MOV AX,0
S2: JMP SHORT S1
NOP
CODESG ENDS
END START
- [xuer2016] 空格可以用条件跳转去掉,有时间再改下 01/03 18:43
- [xuer2016] 最后一题,应该是mov sp,16 11/11 22:47
- [xuer2016] 恩,明白了,谢谢老师 11/04 02:17
- [fpamc] 不是看地址,是看那两条指令的字节数, 11/03 11:46
- [fpamc] 恩~第四章咯。 10/30 21:09
- [fpamc] 记得加H,不然会被认为是10进制。 10/25 20:58
- [fpamc] 做笔记会加深学习的印象。 10/25 20:55
- [xuer2016] 谢谢,我弄错了 应该是 1H * 10H + 偏移地址 10/25 09:45
- [fpamc] 物理地址=起始地址[起始地址=段地址*16(也就是10h)]+偏移地址 10/25 07:29
- [xuer2016] 感谢指出错误 10/20 09:25