gpt4 book ai didi

assembly - ATmega128 : Adding and subtracting 16-bit numbers (assembly)

转载 作者:行者123 更新时间:2023-12-01 08:36:40 24 4
gpt4 key购买 nike

我正在使用 ATmega128 微 Controller ,据说需要添加两个 16 位数字。我正在使用 AVR Studio,这是我目前得到的:

.include "m128def.inc";

.equ ramstart = 0x100
.def temp = r16

.dseg
.org ramstart
number1: .byte 2
number2: .byte 2

.cseg
.org 0

rjmp start

start:
; number1 := 0x7856
ldi temp, low(number1)
sts number1, temp
ldi temp, high(number1)
sts number1+1, temp

; number2 := 0x34B2
lds temp, number1
sts number2, temp
lds temp, number1+1
sts number2+1, temp

slutt:
rjmp slutt

这离我第一次使用任何类型的程序集不远了,我知道我做错了什么,但似乎无法弄清楚是什么。我错过了进位标志吗?

最佳答案

带着铅笔和纸回到小学。如果我想添加 1234 和 5678

  1234
+ 5678
======

4+8 是 2 携带 1
    1
1234
+ 5678
======
2

等等
 00110 <-- carry bits
1234 <-- first operand
+ 5678 <-- second operand
======
6912

位列上方的进位位是有效的,称为进位,进位
离开最左边一列的位被执行。

如果我的纸张宽度足以一次添加两列怎么办?
 110 
34
+ 78
======
12

我从较低的两组数字开始,我需要一个零作为进位。我得到结果 12 和进位。

现在我把那个进位,用它作为下两位数字的进位。这个加法器我必须能够从先前的加法中取出一个进位,并将它用作这个加法的进位。
 001
12
+ 56
====
69

当一切都说完了,我得到 69 和 12,把它们放在一起我得到 6912 但不需要一个完整的 4 位加法器来到达那里。您可以永远重复此操作,或者直到内存、寄存器或时钟周期用完为止。

avr 可能有其他方法来解决问题,但大多数处理器至少有两种形式的加法和两种形式的减法,以便您可以根据需要将加法器级联到尽可能宽的范围。检查 avr 的指令集,上面发生的事情应该会跳到你身上。

编辑:

C 示例可能会有所帮助...(切换到十六进制)
unsigned int a,b,c,d,cin,cout,x,y;

a=0x12; b=0x34;
c=0x56; d=0x78;

x=b+d; //dont want a carry in or assume it is zero
cout=x&0x100;
if(cout) cin=1; else cin=0;
y=a+c+cin; //need the carry out on the prior add as the carry in here

x&=0xFF;
y&=0xFF;

printf("0x%02X%02X\n",y,x);

编辑2:

我希望这不是家庭作业......
ldi r20,0x12
ldi r21,0x34
ldi r22,0x56
ldi r23,0x78
add r21,r23
adc r20,r22

结果在 r20 高字节和 r21 低字节

如果您需要从 ram 中读取有很多方法,这假设 16 位数字是小端
lds r0,0x100
lds r1,0x101
lds r2,0x102
lds r3,0x103
add r0,r2
adc r1,r3

r0 结果的下半部分,r1 上半部分。

或使用 x、y 或 z 指针寄存器之一
;put 0x0100 in Z
ldi r30,0x00
ldi r31,0x01
ld r0,z+
ld r1,z+
ld r2,z+
ld r3,z+
add r0,r2
adc r1,r3

关于assembly - ATmega128 : Adding and subtracting 16-bit numbers (assembly),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9218653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com