本文章为个人博客的备份版本、作者:小游、作者博客:点击访问
【1】采用通过地址表传递参数地址的方法,求数组元素累加和的通用子程序。
; 数据段
datasg segment
; 定义一个数组
ary dw 1,2,3,4,5,6,7,8,9,10
count dw 10
sum dw ?
table dw 3 dup (?) ; 地址表
datasg ends
;--------------------
codesg segment
assume ds:datasg,es:datasg,cs:codesg
; 主函数开始
main proc far
start:
; 这里我们ds入栈
push ds
; 这个是一种习惯性的写法用push入栈,然后使用ret来终止程序
sub ax,ax
; ax入栈
push ax
; datasg的值放入ax中,并且分别赋值给ds和es
mov ax,datasg
mov ds,ax
mov es,ax
; 这里我们是吧ary的地址放入table的第一位中
mov table,offset ary
; 这里我们把count,数目放入table的第二位中
mov table+2,offset count
; 这里我们把sum放入table的第三位中
mov table+4,offset sum
; 跳转命令,我们这里跳转到proadd函数
call proadd
; ret指令用栈中的数据,修改IP的内容,从而实现近转移
ret
;-----------
main endp
; 主函数结束
; 计算开始
proadd proc near
; 把table放到bx寄存器中
mov bx,offset table
; 把bx的第一位,也就是,ary数组放入si寄存器中
mov si,[bx] ;si存放ary的地址
; di存放count的值
mov di,[bx+2] ;di存放count的地址
; cx存放di寄存器的值,这里存放的是循环的次数
mov cx,[di] ;cx存放count的值
; 这里我们把sun最后的结果放入di寄存器中
mov di,[bx+4] ;di存放sum的地址
; 对ax寄存器进行异或操作(一般用于清零操作)
xor ax,ax
next:
; 我们把si寄存器的内容(也就是我们数组里面的内容放入ax寄存器中)
add ax,[si