文章目录
第十章 CALL和RET指令
ret和retf
CPU执行ret指令时,相当于进行:
pop IP
CPU执行retf指令时,相当于进行:
pop IP
pop CS
call指令
call 标号
CPU执行“call 标号”时,相当于进行:
push IP
jmp near ptr 标号
16位位移的范围为-32768~32767
call far ptr 标号
CPU执行“call far ptr 标号”时,相当于进行:
push CS
push IP
jmp far ptr 标号
call 16位reg
push IP
jmp 16位reg
call word ptr 内存单元地址
push IP
jmp word ptr 内存单元地址
call dword ptr 内存单元地址
push CS
push IP
jmp dword ptr 内存单元地址
;先读IP再读CS
call和ret的配合使用
mul指令
(1) 两个相乘的数:两个相乘的数,要么都是8位,要么都是16位。
如果是8位,一个默认放在AL中,另一个放在8位reg或内存字节单元中;
如果是16位,一个默认在AX中,另一个放在16位reg或内存字单元中。
(2) 结果:
如果是8位乘法,结果默认放在AX中;
如果是16位乘法,结果高位默认在DX中存放,低位在AX中放。
用栈传递参数
;计算(a-b)^3
mov ax,1
push ax
mov ax,3
push ax
call difcube
difcube:
push bp
mov bp,sp
mov ax,[bp+4]
sub ax,[bp+6]
mov bp,ax
mul bp
mul bp
pop bp
ret 4 ;ret 4代表pop ip,add sp,n
;参数使用完将sp归位
参数较少时可以用寄存器
防止寄存器冲突
显示字符串
assume cs:code, ss:stack, ds:data
data segment
db "I'm OZY!!!", 0
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
start:
mov dh, 12 ;行
mov dl, 30 ;列
mov cl, 3 ;属性
mov ax, stack
mov ss, ax
mov sp, 16
mov ax, data
mov ds, ax
mov si, 0 ;字符串开始位置
call show_str
mov ax, 4c00h
int 21h
show_str:
;push
push dx
push bx
push si
push di
mov ax, 0b800h
mov es, ax
mov ax, data
mov ds, ax ;段初始化
sub dh, 1 ;定位行
mov ah, 0
mov al, dh
mov bx, 160
mul bl
mov di, ax
sub dl, 1 ;定位列
mov ah, 0
mov al, dl
mov bx, 2
mul bl
add di, ax
mov bx, di
mov di, si
mov si, 0
push cx
show_byte:
mov cl, [di]
mov ch, 0
jcxz ok ;判断是否到达结尾0
mov es:[bx + si], cl ;字符
pop cx
mov es:[bx + si + 1], cl ;属性
push cx
inc di
add si, 2
jmp short show_byte
ok:
;pop
pop cx
pop di
pop si
pop bx
pop dx
ret
code ends
end start
不会溢出的除法
divdw:
;x / n = int(h / n) * 65536 + [rem(h / n) * 65536 + L]/n
mov ss:[0], ax ;存入被除数
mov ss:[2], dx
mov ax, dx
mov dx, 0
div cx ;h/n
mov ss:[4], ax ;h/n的商,对应公式前一半,一会放入dx
mov ax, ss:[0] ;dx已经是h/n的余数了,L放入低位
div cx ;所得的ax即为所求商
mov cx, dx ;cx储存余数
mov dx, ss:[4] ;高位放入dx
ret
数值显示
assume cs:code, ss:stack, ds:data
data segment
db 10 dup (0)
data ends
stack segment
db 32 dup (0)
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 32
mov ax, data
mov ds, ax
mov ax, 11451
mov si, 0
call dtoc
mov dh, 12 ;行
mov dl, 30 ;列
mov cl, 1 ;属性
mov si, 0 ;字符串开始位置
call show_str
mov ax, 4c00h
int 21h
dtoc:
mov bh, 0
mov bl, 10
mov cx, 0
mov si, 0
mov dx, 0
cal:
div bx
mov cx, ax
push dx ;存储余数
inc si ;记录循环次数
jcxz calok
mov dx, 0
jmp short cal
calok:
mov cx, si
mov bx, 0
s2:
pop ax
;余数 + 30H得到ascii,放入data
add al, 30h
mov ds:[bx], al
inc bx
loop s2
ret
show_str:
;实现与上面相同