鱼C论坛

 找回密码
 立即注册
查看: 2372|回复: 1

[汇编作业] 实验五 第五小题 详细解答

[复制链接]
发表于 2018-6-7 00:50:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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段都是其他的数据,在这里就是演示。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-13 16:38:10 | 显示全部楼层
为什么我的最终结果不是2,4,6,8,A,C,E,10呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 07:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表