《汇编语言》——王爽 第十章及实验十子程序设计笔记

第十章 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:
;实现与上面相同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值