目录 上一页 下一页 下一章

-88- PC机汇编语言实战精解









hexout
code

loop
mov
mov
int
mov
int
pop
ret
endp
ends
end
hexloop
dl,CR
ah,2
21h
dl,LF
21h
ax



main
;处理低4位
;DL寄存器置入回车符

;显示回车符
;DL寄存器置入换行符
;显示换行符
;恢复AX寄存器
;返回主程序



  子过程CALC用于显示字符串并计算总字符数。程序首先将堆栈指针SP的值置入BP寄存器,而后将SP寄存器减去2,这样一来在堆栈中就出现了两字节存储空间,这两字节可用[BP-2]寻址,这一存储空间可用于暂存数据。
  使用这种方式分配内存的好处是它比死板地使用DB、DW伪指令要灵活,当子过程返回后,所分到的内存会自动释放,而不占用固定的空间;如果我们把用DB、DW伪指令定义的变量称为"静态变量"(STATIC),那么这种在堆栈中分配到存储空间就是"自动变量"(AUTO)。这两种称谓都出现在C语言中,其实C语言也正是通过堆栈实现"自动变量"的。
5.1.3 通过地址表传递参数
  就我们所编制的这几个程序而言,由于主、子过程均在同一源程序中,所以我们可以直接在子过程中使用那些用DB、DW伪指令定义的变量,也就是将这些变量作为"全局"变量来使用。这可以使我们无需过多考虑参数传递的问题。如果我们要向子过程传递多个分散的数据,则可以采用地址表。下面这个程序是由CALC.ASM变化而来,它和CALC有相同的功能,但请注意参数的传递方式:
CALC2.ASM
CR
LF
data

mess
ascii
sum
addr_tbl
data

code

main



equ
equ
segment
assume
db 'welco
db
dw
dw
ends

segment
assume
proc
mov
mov

0dh
0ah

ds:data
me to pc world',0dh,0ah,24h
'0123456789abcdef'
?
2 dup (?)



cs:code
far
ax,data
ds,ax

;回车符的ASCII码
;换行符的ASCII码


;定义一个字符串
;十六进制数字对应的字符
;定义一个WORD变量保存字符总数
;定义一个地址表





;初始化DS寄存器


Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章