-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 |