(超级重要)汇编语言(王爽)13章编写供应用程序调用的中断例程和恢复寄存器的数据

示例一

编写安装中断7cH(16进制的7C,很久才看明白)的中断例程,求word型数据的平方。
参数:(ax)=要计算的数据
返回值:dx和ax存放结果的高16位和低16位

assume cs:code
code segment
	start:  	
		mov ax,code
		mov ds,ax
		mov si,offset s1	
		
		mov ax,0
		mov es,ax
		mov di,200h
		mov cx,offset s2-offset s1
		
		mov es:[0+4*7ch],di
		mov es:[2+4*7ch],ax
		
		cld
		rep movsb
		
		mov ax,4c00h
		int 21h
	s1:
		mul ax
		;//mov ax,4c00h		//这两行会在本程序跳转21h,不会回到原程序(调用本程序的程序)
		;//int 21h
		;//ret				//会回到原程序,但是不会popf,肯定会有问题
		iret
	s2:
code ends
end start
assume cs:code
code segment
	start:  		
		mov ax,3456
		int 7ch
		add ax,ax	
		mov ax,4c00h
		int 21h
code ends
end start
示例2字符串转大写方法内部使用(修改了)cx和si,所以在进入方法时存入栈里,
离开方法时逆序出栈,存入原寄存器。
之前看书上有提到过对寄存器的数据进行还原,
我以为是看主方法用了哪些寄存器,调用其他方法时在其他方法内部出入栈,
随便想一下也能明白这是不可能的。
唯一的解决办法就是被调用的方法用了哪些,就对哪些出入栈。
自己以前的代码都没有进行处理,不进行复查了(ret和iret返回的方法都可能有问题)

示例2

编写安装中断7cH的中断例程,把一个全是字母以0结尾的字符串转大写。
参数:ds:si指向字符串的首地址

assume cs:code
code segment
	start:  	
		mov ax,code
		mov ds,ax
		mov si,offset s1	
		
		mov ax,0
		mov es,ax
		mov di,200h
		mov cx,offset s2-offset s1
		
		mov es:[0+4*7ch],di
		mov es:[2+4*7ch],ax
		
		cld
		rep movsb
		
		mov ax,4c00h
		int 21h
	s1:
		mov si,0
	s3:
		push cx			;//<-------超级重要
		push si			;//<-------超级重要
		mov cl,[si]
		cmp cl,0
		jz ok
		and cl,11011111b
		mov [si],cl
		inc si
		jmp short s3
	ok:
		pop si			;//<-------超级重要
		pop cx			;//<-------超级重要
		iret
	s2:
code ends
end start
assume cs:code,ds:data
data segment
	db 'goodmorning',0
data ends
code segment
	start:  		
		mov ax,data
		mov ds,ax
		mov si,0
		int 7ch
		mov ax,4c00h
		int 21h
code ends
end start
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值