【汇编语言】第 9 章 转移指令的原理

版权声明:本文为 gfson 原创文章,转载请注明出处。
注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢。

9.1 概述

【汇编语言】第 9 章 转移指令的原理_第1张图片

9.2 操作符 offset

【汇编语言】第 9 章 转移指令的原理_第2张图片

9.3 jmp 指令

  • jmp short 标号(段内短转移
【汇编语言】第 9 章 转移指令的原理_第3张图片
  • jmp near ptr 标号(段内近转移
【汇编语言】第 9 章 转移指令的原理_第4张图片
  • jmp far ptr 标号(段间转移,远转移
  • jmp word ptr 内存单元地址(段内转移
【汇编语言】第 9 章 转移指令的原理_第5张图片
  • jmp dword ptr 内存单元地址(段间转移
【汇编语言】第 9 章 转移指令的原理_第6张图片

9.4 检测点 9.1

【汇编语言】第 9 章 转移指令的原理_第7张图片
【汇编语言】第 9 章 转移指令的原理_第8张图片
  • 答案:
    (1)db 0,0,0
    (2)如下所示:
  • bx
  • cs

(3)(CS)=0006,(IP)=00BE

9.5 jcxz 指令

【汇编语言】第 9 章 转移指令的原理_第9张图片

9.6 检测点 9.2

【汇编语言】第 9 章 转移指令的原理_第10张图片
  • 答案:
mov cl, [bx]
mov ch, 0 ;注意这一步是必需的
jcxz ok
inc bx

9.7 loop 指令

【汇编语言】第 9 章 转移指令的原理_第11张图片

9.8 检测点 9.3

【汇编语言】第 9 章 转移指令的原理_第12张图片
  • 答案:
inc cx ;注意loop的工作原理

9.9 根据位移进行转移的意义

  • 为了使程序在内存的各个地方都可以运行,不受内存固定地址的限制
【汇编语言】第 9 章 转移指令的原理_第13张图片

9.10 实验 8

【汇编语言】第 9 章 转移指令的原理_第14张图片
  • 答案:
  • 程序的入口为 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, 4c00hint 21h,正确返回。
  • 所以程序可以正常返回。

9.11 实验 9

【汇编语言】第 9 章 转移指令的原理_第15张图片
【汇编语言】第 9 章 转移指令的原理_第16张图片
【汇编语言】第 9 章 转移指令的原理_第17张图片
  • 答案:
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

你可能感兴趣的:(【汇编语言】第 9 章 转移指令的原理)