下面的程序中将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
- [mywiil] 我没用书上的入栈出栈写,就是先看看不用书上的方法能做出来否? ============== 不错 09/19 09:24
- [njutyangxiao] 谢谢你的指导 09/18 17:00
- [younggay] 嗯,应该说理解的没问题。 09/18 15:41
- [njutyangxiao] 检测点16.1的题目是中是这样定义的: a dw 1,2,3,4,5,6,7,8 b dd 09/16 11:23
- [njutyangxiao] 嗯,谢谢指导 09/16 11:22
- [wsrf] assume伪指令指定了段中标号与相应段寄存器的联系。 09/16 09:46
- [wsrf] 没有问题,不过源代码中 a db 1,2,3,4,5,6,7,8 b dw 0 怎么 09/16 09:43
- [njutyangxiao] 谢谢,keep moving! 09/16 09:06
- [njutyangxiao] 谢谢你的指导 09/16 09:05
- [njutyangxiao] 谢谢你的指导 09/16 09:05
[ 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
我没有抄写错题目啊!