汇编网首页登录博客注册
xuer2016的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
文章收藏
友情链接

[2012-12-12 01:58] 第九章笔记

第九章笔记
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
评论次数(0)  |  浏览次数(371)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码