版权声明:本文为 gfson
原创文章,转载请注明出处。
注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢。
9.1 概述
9.2 操作符 offset
9.3 jmp 指令
- jmp short 标号(段内短转移)
- jmp near ptr 标号(段内近转移)
- jmp far ptr 标号(段间转移,远转移)
- jmp word ptr 内存单元地址(段内转移)
- jmp dword ptr 内存单元地址(段间转移)
9.4 检测点 9.1
- 答案:
(1)db 0,0,0
(2)如下所示:
- bx
- cs
(3)(CS)=0006,(IP)=00BE
9.5 jcxz 指令
9.6 检测点 9.2
- 答案:
mov cl, [bx]
mov ch, 0 ;注意这一步是必需的
jcxz ok
inc bx
9.7 loop 指令
9.8 检测点 9.3
- 答案:
inc cx ;注意loop的工作原理
9.9 根据位移进行转移的意义
- 为了使程序在内存的各个地方都可以运行,不受内存固定地址的限制。
9.10 实验 8
- 答案:
- 程序的入口为
mov ax, 0
。- 注意到指令
jmp short s1
占 2 字节,于是指令mov di, offset s
将 s 的偏移地址传送到寄存器 DI,mov si, offset s2
将 s2 的偏移地址传送到 SI,然后再通过通用寄存器 ax 做中转将 s2 处的指令复制到 s 处,最后再跳转至 s 处执行复制过来的指令。- 注意
jmp short s1
是相对跳转,其直接修改 IP 寄存器,从 s2 到 s1 共有8个字节的偏移,实际上jmp short s1
等价于(ip)=(ip)-8
,通过 Debug 可知第一个 nop 指令的偏移地址为 8,所以再执行了复制过的指令后,IP 将指向 0,程序按照顺序执行mov ax, 4c00h
和int 21h
,正确返回。- 所以程序可以正常返回。
9.11 实验 9
- 答案:
assume cs:code
data segment
db 'welcome to masm!'
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,0
mov di,10*160+80 ;第十行中间
mov cx,16
s1: mov al,ds:[si]
mov ah,00000010B ;绿色
mov es:[di],ax
inc si
inc di
inc di
loop s1
mov si,0
mov di,11*160+80 ;第十一行中间
mov cx,16
s2: mov al,ds:[si]
mov ah,00100100B ;绿底红色
mov es:[di],ax
inc si
inc di
inc di
loop s2
mov si,0
mov di,12*160+80 ;第十二行中间
mov cx,16
s3: mov al,ds:[si]
mov ah,01110001B ;白底蓝色
mov es:[di],ax
inc si
inc di
inc di
loop s3
mov ax,4c00h
int 21h ;如果要看到完整的显示请输入:“-g 4c”,即立即运行到此条指令
code ends
end start