我的一个循环中有一个错误,我无法修复它。这是我在学校的HW任务的一部分。 我有一个数组,有20个元素,我需要使用位移将每个元素乘以2。 它有点工作,但每次我有一个进位时,它会在数组中的前一个元素中加2,而不是一个。我无法正确传播数组的传输。 这是我装配的第一个学期,所以感谢你的帮助。另外,如果可以,请保持简单。谢谢。
这就是我想要的: 0000000009 ==> 0000000018 0000000099 ==> 0000000198
这就是我所得到的。 0000000009 ==> 0000000028 0000000099 ==> 00000002108
这是代码。
ARR1 DB 20 DUP (0)
MULTIPLYING PROC
MOV AX, 0
MOV CX, 19
.WHILE CX != 0
MOV DI, CX
MOV AL, [DIGIT_ARR1+DI]
;MOV BL, 2
;MUL BL
SHL AX, 1
.IF AX > 9 ; IF THE NEW DIGIT IS LARGER THAN 9
SUB AX, 10
MOV AH, 0
MOV [DIGIT_ARR1+DI], AL
DEC DI
ADD [DIGIT_ARR1+DI], 1
.ELSEIF
MOV [DIGIT_ARR1+DI], AL ; IF IT IS LESS THAN 9, THEN JUST INSERT IT BACK INTO THE ARRAY
.ENDIF
DEC CX
.ENDW
RET
MULTIPLYING ENDP
答案 0 :(得分:1)
所以说菲尔是正确的。我正在重写我自己的数据。诀窍是读取值,使用位移进行乘法,添加进位(如果有的话),然后再写回数组。通过这种方式,我可以将每个元素乘以2而不会损坏我的数据。
对于像我这样的初学者的注意事项:位移只会乘以2,所以如果你需要乘以其他东西,请使用mul或imul。此外,向右移位将除以2。 下面的循环将BCD中的BCD乘以2。分区的工作方式相同,只是确保以另一种方式处理数组,并在进位时为每个下一个数字加10。您还必须确保在到达阵列末尾时不添加进位。汇编语言不会检查您是否超出数组范围。
MULTIPLYING PROC
PUSH CX
PUSH AX
MOV CARRY, 0 ; START WITH EMPTY CARRY FLAG
MOV CX, 19 ; ARRAY SIZE
.WHILE CX > 0
MOV DI, CX ; GET ELEMENT ADDRESS
MOV AL, [ARR1+DI] ; READ THE ELEMENT
SHL AL, 1 ; DOUBLING THE DIGIT
ADD AL, CARRY ; ADD THE CARRY FLAG
MOV CARRY, 0 ; CLEAR THE CARRY FLAG
.IF AL > 9 ; IF THE NEW DIGIT IS LARGER THAN 9
SUB AL, 10
MOV CARRY, 1 ; SET CARRY FLAG
MOV [ARR1+DI], AL ; INSERTING THE DOUBLED DIGIT BACK TO THE ARRAY
.ELSEIF
MOV [DIGIT_ARR1+DI], AL ; IF IT IS LESS THAN 9, INSERT IT BACK INTO THE ARRAY
MOV CARRY, 0
.ENDIF
DEC CX
.ENDW ; END OF MULTIPLICATION PROC
POP AX
POP CX
RET
MULTIPLYING ENDP
答案 1 :(得分:0)
我认为问题在于您正在写回您正在阅读的相同地址数组。当你随身携带时,它正在破坏计算。
e.g。 来自:99
Positon 19 = 9
9*2 = 18 (set position 19 to 8, increment position 18 to 10)
Position 18 = 10
10*2 = 20 (set position 18 to 10, increment position 17 to 1)
Position 17 = 1
1*2 = 2 (set position 17 to 2)
Result: 2108
但是你仍然需要做更多的工作,因为即使你有目的地地址空白
Positon 19 = 9
9*2 = 18 (set position 19 to 8, increment position 18 to 1)
Position 18 = 9
9*2 = 18 (set position 18 to 8, increment position 17 to 1)
Position 17 = 1
1*2 = 2 (set position 17 to 2)
Result: 288
您需要在位置18处将8添加到1,因此您得到9.而您不进行第3次乘法,因为位置17在源地址数组中为空。我希望这是有道理的。
当像这样乘以2时,你不应该得到任何数字溢出错误,但是当你乘以更大的数字时你可能需要处理它。