汇编网首页登录博客注册
njutyangxiao的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  原泉混混,不舍昼夜。盈科而后进,放乎四海,有本着如是,是之取尔!
  • 『姓名』:杨逍
  • 『性别』:男『发送消息
  • 个人说明:
  • 详细信息『加为好友』
学习动态
最新留言

[2009-09-15 13:50] 检测点16.1

下面的程序中将codesg段的8个数据累加,结果存储到b处的双字节中,补全程序。
assume cs:codesg
codesg segment
    a dw 1,2,3,4,5,6,7,8
    b dd 0
  
    start:
    mov si,0
    mov cx,8
  s:
    mov ax,__(1)___
    add ___(2)___,ax
    adc ___(3)___,0
    add si,___(4)___
    loop s

    mov ax,4c00h
    int 21h

codesg ends
end start
解析:在开始之前,一定要看清楚了在定义a、b时,它们的后面并没有冒号。这一点很关键,我就是没有注意到这一点,导致调试程序的时候,用a[si]取得的值并不正确,本来应该是在地址cs:a[si]取得的,但是如果有冒号的话,它则是从地址ds:a[si]取得。所以看书还是要小心仔细啊。接下来的事情就是顺利成章了:
(1)处是要填写a[si]用以取得在a处定义的数据
(2)处时要填写b[0],因为相加的另一个数据时ax。所以在b[0]前要有word ptr 的限制
(3)与(2)同样的道理,填写word ptr b[2]
(4)处要填写2,应为a处定义的是字。所以加2
源代码:
assume cs:codesg
codesg segment
    a db 1,2,3,4,5,6,7,8
    b dw 0

    start:

    mov si,0
    mov cx,8

    s:
    mov al,a[si]
    mov ah,0
    add b,ax
    inc si
    loop s

    mov ax,4c00h
    int 21h

codesg ends
end start
评论次数(2)  |  浏览次数(603)  |  类型(汇编作业) |  收藏此文  | 

[  wsrf   发表于  2009-09-16 09:43  ]

没有问题,不过源代码中    
a db 1,2,3,4,5,6,7,8 
b dw 0
怎么和题目的要求不一致了?

此外,当标号后代有‘:’时,编译器会提示“Illegal size for operand”警告错误,这种用法是错误的。因为跟冒号的标号不能指定操作数所占空间的大小。

[  njutyangxiao   发表于  2009-09-16 11:23  ]

检测点16.1的题目是中是这样定义的:
 a dw 1,2,3,4,5,6,7,8 
 b dd 0 
我没有抄写错题目啊!

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码