主题:[原创]程序填空
大吉大利
[专家分:0] 发布于 2006-10-26 16:05:00
在DAT1和DAT2开始的存储单元中分别存放着100个字节的无符号数,低地址存低位数,高地址存高字节数.从低字节开始计算两个无符号数对应字节之和,并存于SUM开始的单元中,以形成一个新的无符号数.此次计算一直进行到俩数对应字节之和为0或者两个无符号数所有字节计算完为止.将新的无符号数长度存于LEN单元中。请在下面程序段每一空白处填上一条适当指令。
XOR AX,AX
MOV CX,100
MOV BX,-1
LP:______
MOV AL,DAT1[BX]
ADC AL,DAT2[BX]
MOV SUM[BX],AL
_____________________
JC GAO
JZ DONE
___________________
JMP DONE
GAO:MOV AL,1
INC BX
MOV SUM[BX],AL
DONE:MOV LEN,BL
HLT
回复列表 (共8个回复)
沙发
密码注册 [专家分:350] 发布于 2006-10-26 20:33:00
应该是这么填滴:
XOR AX,AX
MOV CX,100
MOV BX,-1
LP: INC BX
MOV AL,DAT1[BX]
ADC AL,DAT2[BX]
MOV SUM[BX],AL
CMP AL,0
JC GAO
JZ DONE
LOOP LP
JMP DONE
GAO:MOV AL,1
INC BX
MOV SUM[BX],AL
DONE:MOV LEN,BL
HLT
不过这段代码我看的也是模糊,不确保第二句的正确性,算帮你顶下,看有没有高手来
板凳
密码注册 [专家分:350] 发布于 2006-10-27 12:02:00
我想问问楼主的《原创》是怎么回事儿?莫非考究大伙来着??
3 楼
大吉大利 [专家分:0] 发布于 2006-10-27 15:12:00
应该是《求助》,这是清华大学一本自学指导书上的题,答案是
1。INC BX
2。LOOPNZ LP
3。INC BL
第2、3空我看不懂,帮忙给看看。
4 楼
密码注册 [专家分:350] 发布于 2006-10-27 17:46:00
1。inc bx;程序原先将bx减成-1,必须加1变成0,这样可以寻址dat1和dat2的起始地址
2。Loopnz lp;这条判断循环计数是否完了,cx减1后是否为零,同时判断ADC AL,DAT2[BX]这条语句的相加结果是否为零,两者都不为零则跳转到lp。这样就符合题意了。
3。bl加1可能是因为作者是认为长度的计算不是从零开始而是从1开始的吧,就好像16位寄存器只有0——15个位,而作者认为长度是1——16。计算长度的时候bl是从0开始的,而不是从1开始,所以加1。。。
看了答案就明白了。。。我真搞笑咯。
5 楼
密码注册 [专家分:350] 发布于 2006-10-27 18:58:00
补充一下:ADC AL,DAT2[BX];
ADC语句是影响标志位的,如果相加结果为0,标志位zf就为零,而loopnz判断的就是zf和cx的内容。
bl从程序开始前就被定义为sum的位移量(从零一直到相加结束),所以它加1的次数就是sum的长度。
这下可以+30了吧?挖哈哈
6 楼
大吉大利 [专家分:0] 发布于 2006-10-27 22:34:00
还有一些疑问第二空之后的JC 、JZ两条指令是根据谁的结果转移?
GAO:MOV AL,1是干什么呢?
麻烦再分析分析
7 楼
密码注册 [专家分:350] 发布于 2006-10-28 09:58:00
唉,这分可真难得啊。。。你知道,有时候宁愿自己写代码也不愿意tmd的读人家的代码,何况我这小菜鸟。
jc 是根据cf进位位的情况跳转,如果cf为1,ADC AL,DAT2[BX]这条语句有1个进位,这个进位是不能丢失的,在循环中,有ADC AL,DAT2[BX]这条语句保证cf进位位重新加入到下一次ADC AL,DAT2[BX]运算中,可到了最后一次ADC AL,DAT2[BX]运行的时候呢?如果产生进位怎么办?所以跳转到GAO语句,将这个1单独存储为一个字节单元,并且将这个进位放到新的无符号数最后一位,也就是新无符号数的最高位。
jz判断最后一条ADC AL,DAT2[BX]是否相加得0,得0就简单了,不用分配空间,不用bl+1,跳转,程序结束。。。
强烈要求++30分。。。
8 楼
大吉大利 [专家分:0] 发布于 2006-10-28 14:32:00
明白了,多谢。加50分。
我来回复