汇编笔记6

第九章 转移指令的原理

8086CPU 的转移

1

一些指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
offset 标号   ;取标号处偏移地址,例 mov di,offset s

jmp short 标号 ;转到标号处执行指令,jmp指令实质上是提供偏移的“位移”
;(IP)=(IP)+8位位移(-128~127用补码表示)

jmp near ptr 标号 ;(IP)=(IP)+16位位移(-32768~32767用补码表示)

jmp far ptr 标号 ;段间转移(远转移)
;(CS)=标号处所在的段地址,(IP)=标号处在段中的偏移地址

jmp 16位reg ;(IP)=(reg)

jmp word ptr 内存单元地址(段内转移)
;内存中的大小为字的偏移地址

jmp dword ptr 内存单元地址(段间转移)
;高地址处的字是转移目的的段地址
;低地址处是偏移地址

jcxz 标号 ;条件转移(所有的条件转移都是短转移)
;如果cx==0,则转移至标号处

所有的转移,超界(比如短转移超过128个字节)编译都会报错

实验九

贴一下实验9的内容吧

2
3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
assume cs:codesg

data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends

stack segment
db 0,0,0,0,0,0,0,0
stack ends

codesg segment
start:
mov ax,0B878h ;设置打印行地址
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,9
mov di,0
mov ax,data
mov es,ax

mov si,64
mov cx,3
s0:
push cx
mov bx,0
mov ah,es:[16+di]

mov cx,16
s: ;打印一行数据
mov al,es:[bx]
mov ds:[si],al
mov ds:[si+1],ah
add bx,1
add si,2
loop s

add si,128 ;打印一行后换行
inc di
pop cx
loop s0

keepon:
jmp short keepon

mov ax,4c00h
int 21h
codesg ends

end start

Comments