使用位移的汇编语言数组乘法错误

时间:2014-11-30 22:47:32

标签: arrays assembly multiplication

我的一个循环中有一个错误,我无法修复它。这是我在学校的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

2 个答案:

答案 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时,你不应该得到任何数字溢出错误,但是当你乘以更大的数字时你可能需要处理它。