示例一
编写安装中断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