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