自学王爽老师《汇编语言》笔记——第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 指令要给出的信息:
- 转移的目的地址
- 转移的距离(段间转移、段内短转移、段内近转移)
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指令
有两种格式:
jmp word ptr 内存单元地址
(段内转移)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,转移到标号处执行。) - 操作:
- (cx) = (cx) - 1
- 如果(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#汇编语言##自学##读书笔记#