回 帖 发 新 帖 刷新版面

主题:[原创]程序填空

在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个回复)

沙发

应该是这么填滴:

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

不过这段代码我看的也是模糊,不确保第二句的正确性,算帮你顶下,看有没有高手来

板凳

我想问问楼主的《原创》是怎么回事儿?莫非考究大伙来着??

3 楼


应该是《求助》,这是清华大学一本自学指导书上的题,答案是
1。INC BX

2。LOOPNZ LP
 
3。INC BL

第2、3空我看不懂,帮忙给看看。

4 楼

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 楼

补充一下:ADC AL,DAT2[BX];
ADC语句是影响标志位的,如果相加结果为0,标志位zf就为零,而loopnz判断的就是zf和cx的内容。
bl从程序开始前就被定义为sum的位移量(从零一直到相加结束),所以它加1的次数就是sum的长度。
这下可以+30了吧?挖哈哈

6 楼


还有一些疑问第二空之后的JC 、JZ两条指令是根据谁的结果转移?
GAO:MOV AL,1是干什么呢?
麻烦再分析分析

7 楼

唉,这分可真难得啊。。。你知道,有时候宁愿自己写代码也不愿意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 楼

明白了,多谢。加50分。

我来回复

您尚未登录,请登录后再回复。点此登录或注册