汇编语言(王爽) 第9章转移指令的原理

时间:2021-07-18 00:59:59

啥叫转移指令

修改IP或同时修改CS和IP的指令

汇编语言(王爽) 第9章转移指令的原理

只修改IP叫段内转移

同时修改CS和IP叫段间转移

段内转移又分为短转移和近转移

短转移 IP修改范围-128-127

近转移IP修改范围-32768-32767

基本的就上面的

9.1 offset 操作符

s1:mov bx,offset s1

s:mov ax,offset s

offset X就是取得X的偏移地址

first 就是mov bx,ds:ds:[0]

second  is mov ax,ds:[3]

first instruction is 3 byte

9.3 依据位移转移的JMP指令

jmp short 标号(转到标号处执行指令)

其实跳到哪里是看指令的偏移地址,上面说法是错的,比如实验8,分析一个奇怪的程序

9.4 指定转移目的地的指令

jmp far ptr段间转移 远转移

比如 jmp far ptr s 对应的机器码是EA 0B 01 BD 0B

高地址0bdbh是转移的段地址,低地址010bH是偏移地址

9.5 jmp 寄存器

jmp ax

设置IP=ax

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

1 jmp word ptr 内存单元地址(段内转移)

mov ax,0123h

mov ds:[0],ax

jmp word ptr ds:[0]

执行后ip=0123h

2 jmp dwood ptr 内存单元地址(段间转移) 2个字

mov ax,0123h

mov ds:[0],ax

mov word ptr ds:[2],0

jmp dword ptr ds:[0]

执行后cs=0.ip=0123h

9.7 jcxz

if(cx==0) jmp short 标号

9.8 loop

cx--

if(cx!=0) jmp short 标号

9.10 编译器对转移位移越界会报错

比如

jmp short s

db 128 dup (1)

s:mov ax,0111h

因为short的IP偏移地址是-128-127

所以超过了1,报错

下面是实验8一个奇怪的实验,主要考察dmp short 标号指令的偏移应用

http://tinylab.org/assembly/sy/sy8.htm

实验9是一个在DOS上打文字的程序

assume cs:code,ds:data
data segment
db 'welcome to masm!'
db 02h,24h,24h
data ends
code segment
start:
mov ax,0b872H
mov es,ax

mov ax,data
mov ds,ax

mov bx,0
mov cx,16
mov di,0
s:
mov al,ds:[bx]
mov ah,ds:[18]
mov es:[di],ax
inc bx
add di,2
loop s

mov ax,4c00h
int 21h
code ends
end start

源代码就这样

反正是在显存段b8000H-b8f9fH进行,2个字节的长度,一个放ASCII码另一个放属性

属性就是指背景色,字体色这些

EOF