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

啥叫转移指令oop

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

只修改IP叫段内转移code

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

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

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

近转移IP修改范围-32768-32767编译器

基本的就上面的it

9.1 offset 操做符io

s1:mov bx,offset s1asm

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

相关文章
相关标签/搜索