啥叫转移指令
修改IP或同时修改CS和IP的指令
只修改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