|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
写code段中的代码,将a段和b段数据依次相加,结果存入c段
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
code segment
start:
???????
mov ax,4c00h
int 21h
code ends
end start
程序分析:
(1)这个题目一下子搞出3个数据段了。呵呵,貌似我们段寄存器不够用了。cs(代码段),ss(栈段),这二个千万别碰!那只有ds和es了。思路:将a和b段我们用一个段地址表示,存储在ds中;c段我们存储在es中。?这种方式好吗?不太好。
(2)上面已经体会了,当一个数据段不足16个字节时,按16个字节分配内存空间,其余的补0。我们发现a、b段都是定义了8个字节的数值。并且是相邻的(肯定是的),那么a段的地址我们使用[bx+idata]表示,b段我们也使用[bx+idata]表示。这种方式没有把a段和b段分开。
(3)最终决定:将es指向c段,ds分开分别的指向a段和b段,这样我们在一个循环内完成所有的工作了;程序中使用了栈保存了ds的值;
最终代码如下:
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
cz segment
db 0,0,0,0,0,0,0,0
cz ends
code segment
start:
mov ax,a
mov ds,ax ;ds指向a段
mov ax,b
mov es,ax ;es指向b段
mov bx,0
mov cx,8 ;计算8次,故计数器为8
s:
mov dl, [bx] ;将ds:[bx]内存单元按字节送入dl,此循环用到ax
add dl, es:[bx] ;将ds:[bx]与es:[bx]内存单元值相加
push ds ;保护ds值,因为下面用到ds了
mov ax, cz ;我的编译器不认C这个段的标号,故改成了CZ
mov ds, ax ;将ds指向cz段
mov [bx], dl ;将dl(a和b相对应内存单元内容之和)写入cz中
pop ds ;将ds恢复
inc bx ;bx递增
loop s
mov ax,4c00h
int 21h
code ends
end start
结果分析:
(1)ds段寄存器在程序中可以存储不同的内存段的段地址,并不是唯一存储一个段地址,es也是如此。
(2)合理利用系统自动创建的栈空间,利用栈空间来保存暂存的数据。注意压栈和弹栈的顺序,确保操作的是一个数据对象。
(3)在遇到多个数据段的情况下,这种方式可以利用一个段寄存器来对多个内存段寻址。
(4)在实际工程中,在程序中保存的数据,都是程序的一些必须的初始化的数据,其他的数据都应保存在磁盘文件中,需要时才读入内存中。此例中的a、b、cz段都是其他的数据,在这里就是演示。 |
|