啥叫转移指令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