自学王爽老师《汇编语言》笔记——第9章 转移指令的原理

第9章 转移指令的原理

可以修改 IP,或者同时修改 CS 和 IP 的指令统称为转移指令。

8086CPU的转移行为有以下几类:

  • 段内转移:只修改 IP。
    • 短转移:IP修改范围为 -128 ~ 127
    • 近转移:IP修改范围为 -32768 ~ 32767
  • 段间转移:同时修改 CS 和 IP。

8086CPU的转移指令:

  • 无条件转移指令
  • 条件转移指令
  • 循环指令
  • 过程
  • 中断

9.1 操作符offset

  • 操作符offset在汇编语言中是由编译器处理的符号。
  • 它的功能是取得标号的偏移地址。

9.2 jmp指令

  • jmp 为无条件转移指令,可以只修改 IP,也可以同时修改 CS 和 IP。
  • jmp 指令要给出的信息:
    1. 转移的目的地址
    2. 转移的距离(段间转移、段内短转移、段内近转移)

9.3 依据位移指令进行转移的jmp指令

段内短转移:jmp short 标号(转到标号处执行指令)

  • 该指令实际的功能为 “(IP) = (IP) + 8 位位移”。
  • 8 位位移的范围为 “-128 ~ 127”,用补码表示。
  • 8 位位移 = 标号处的地址 - jmp 指令后第一个字节的地址
  • 8 位位移由编译程序在编译时算出。

段内近转移:jmp near ptr 标号

  • 该指令实际的功能为 “(IP) = (IP) + 16 位位移”。
  • near ptr 指明此处的位移为 16 位位移,进行的是段内近转移。

段内转移所对应的机器码中,并不包含转移的目的地址,而包含的是转移的位移。

9.4 转移的目的地址在指令中的jmp指令

jmp far ptr 标号 实现的是段间转移,又称为远转移。

目的地址在机器指令中的存储顺序为:

汇编指令:
    jmp far ptr x   ; 设 x 所在的地址为:[CS:IP] = [AABB:XXYY]
机器指令:
    EA YYXX BBAA

9.5 转移地址在寄存器中的jmp指令

  • 指令格式:jmp 16位reg
  • 功能:(IP) = (16位reg)

9.6 转移指令在内存中的jmp指令

有两种格式:

  1. jmp word ptr 内存单元地址 (段内转移)
  2. jmp dword ptr 内存单元地址 (段间转移)
    • 高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。
    • 例如:
      • jmp dword ptr ds:[0] (该处存储的值为:AABBXXYY)
      • 得到的 CS 和 IP 为:(CS) = YYXX, (IP) = BBAA。

内存单元地址可用寻址方式的任一格式给出。

9.7 jcxz指令

jcxz 指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。

  • 指令格式:jcxz 标号 (如果(cx)=0,转移到标号处执行。)
  • 操作:当(cx)=0 时,(IP) = (IP) + 8位位移;当(cx)!=0时,什么也不做。
    • 8位位移 = 标号处地址 - jcxz 指令后的第一个字节的地址

9.8 loop指令

loop 指令为循环指令,所有循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。

  • 指令格式:loop 标号 ((cx)=(cx)-1,如果(cx)!=0,转移到标号处执行。)
  • 操作:
    1. (cx) = (cx) - 1
    2. 如果(cx)!=0,(IP) = (IP) + 8位位移

dec 指令的功能和 inc 相反,dec bx进行的操作是(bx)=(bx)-1。

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

这种设计方便了程序段在内存中的浮动分配。如果是根据目标地址转移,则就对程序段在内存中的偏移地址有了严格的限制。

9.10 编译器对转移位移超界的检测

根据位移进行转移的指令,它们的转移范围受到严格的限制,如果在源程序中范围超界,在编译的时候编译器会报错。

实验8 分析一个奇怪的程序

  • nop是空指令,占用一个字节,不执行任何操作,只占用一个指令时间。

实验9 根据材料编程

编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 'welcome to masm'。

0000 0010 ; 绿色
1010 0100 ; 绿底红色带闪烁
0111 0001 ; 白底蓝色
assume cs:codesg, ds:datasg, ss:stacksg

datasg segment
    db 'Welcome to masm!'
    db 02h, 0A4h, 71h
datasg ends

stacksg segment
    db 128 dup(0)
stacksg ends

codesg segment
start:  mov ax,datasg
        mov ds,ax

        mov ax,stacksg
        mov ss,ax
        mov sp,128

        mov ax,0b800h
        mov es,ax

        mov si,0
        mov di,160*12 + 30*2
        mov bx,16
        mov dx,0

        mov cx,3
   put: push bx
        push cx
        push si
        push di

        mov cx,16
        mov dh,ds:[bx]

   row: mov dl,ds:[si]
        mov es:[di],dx
        add di,2
        inc si
        loop row

        pop di
        pop si
        pop cx
        pop bx

        add di,160
        inc bx
        loop put

        mov ax,4c00h
        int 21h
codesg ends
end start
#汇编语言##自学##读书笔记#
全部评论
感谢大佬分享的汇编知识
点赞 回复 分享
发布于 2022-08-30 10:56 陕西

相关推荐

不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
10-28 14:42
门头沟学院 Java
watermelon1124:因为嵌入式炸了
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务