将两个 8 位数字相乘,得到 16 位数字作为结果,使用 8 位寄存器,仅使用加法指令

问题描述 投票:0回答:1

我是汇编编码新手,我正在努力为大学目的学习。 我们使用ATmel Studio来模拟ATmega结构,我们将使用ATmega328指令集。我有这个练习,我必须将两个 8 位数字(即 0b00111010 和 0b01010101)仅与加法指令(甚至 adc,无论是哪一个)相乘。我很挣扎,因为我的教授没有给任何论文,只是 ATmega238 的指令集手册,所以我迷路了。

请帮助我,我快疯了。

按照我的chat-gpt帮助代码无法正常工作,它只完成了一半的任务,因为它只正确计算结果的LSB,MSB是错误的。 我认为问题出在“adc r19,r1”行,但我不知道如何解决它。

; Input r16 (00111010), r17 (01010101)
; Output r18:r19 (risultato)

    ldi r16, 0b00111010   ; Load first number in r16
    ldi r17, 0b01010101   ; Load second number in r17

    ldi r18, 0            ; Initialize LSB's resoult to 0
    ldi r19, 0            ; Initialize MSB's resoult to 0

    ldi r20, 8            ; 8 bit counter

multiply_loop:
    lsr r17               ; Shift to dx the first number
    brcc no_add           ; Skip if the LSB is 0

    add r18, r16          ; Add first number to the lower part of the resoult
    adc r19, r1           ; Add carry to the higher part of the resoult

no_add:
    lsl r16               ; Left shift of first number

    dec r20               ; Decrease counter
    brne multiply_loop    ; Repeat cycle until counter is 0

    ; Final resoult in r18:r19
assembly avr algebra atmega atmelstudio
1个回答
0
投票

在您的代码中,问题确实出在

adc r19, r1
行。它应该是
adc r19, r18
,因为您要将进位添加到结果的较高部分,而进位来自
r18
r16
的相加。这是更正后的代码:

ldi r16, 0b00111010   ; Load first number in r16
ldi r17, 0b01010101   ; Load second number in r17

ldi r18, 0            ; Initialize LSB's result to 0
ldi r19, 0            ; Initialize MSB's result to 0

ldi r20, 8            ; 8 bit counter
multiply_loop: lsr r17 ; Shift to dx the first number
brcc no_add           ; Skip if the LSB is 0

add r18, r16          ; Add first number to the lower part of the result
adc r19, r18          ; Add carry to the higher part of the result
no_add: lsl r16       ; Left shift of first number

dec r20               ; Decrease counter
brne multiply_loop    ; Repeat cycle until counter is 0

; Final result in r18:r19

我希望这能解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.