Las*_*sen 3 microcontroller assembly atmel
我正在使用ATmega128微控制器,据说需要添加两个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
Run Code Online (Sandbox Code Playgroud)
这离我第一次使用任何类型的装配都不远,我知道我做错了什么,但似乎无法弄清楚是什么.我错过了进旗吗?
回到铅笔和纸的gradechool.如果我想添加1234和5678
1234
+ 5678
======
Run Code Online (Sandbox Code Playgroud)
4 + 8是2携带1
1
1234
+ 5678
======
2
Run Code Online (Sandbox Code Playgroud)
等等
00110 <-- carry bits
1234 <-- first operand
+ 5678 <-- second operand
======
6912
Run Code Online (Sandbox Code Playgroud)
一列上方的进位是重要的,它被称为进位,并且离开最左列的进位被执行.
如果我的纸张宽度足以一次添加两列,该怎么办?
110
34
+ 78
======
12
Run Code Online (Sandbox Code Playgroud)
我从两个较低的数字开始,我需要一个零作为进位.我得到一个带有执行的结果12.
现在我把它拿出来,用它作为接下来两位数的进位.这个加法器我必须能够从之前的添加中执行,并将其用作此添加的进位.
001
12
+ 56
====
69
Run Code Online (Sandbox Code Playgroud)
当所有的事情都说完了,我得到69和12,把它们放在一起我得到6912但是不需要一个完整的4位数加法器来达到那里.您可以永久重复此操作,也可以直到内存,寄存器或时钟周期耗尽.
avr可能有其他方法来解决问题,但大多数处理器至少有两种形式的加法和两种形式的减法,这样你就可以将加法器级联到你需要的范围.检查avr的指令集,上面发生的事情应该跳出来.
编辑:
AC示例可能有帮助...(切换到十六进制)
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);
Run Code Online (Sandbox Code Playgroud)
EDIT2:
我希望这不是家庭作业......
ldi r20,0x12
ldi r21,0x34
ldi r22,0x56
ldi r23,0x78
add r21,r23
adc r20,r22
Run Code Online (Sandbox Code Playgroud)
结果是r20高字节,r21低字节
如果你需要从ram读取有很多方法,这假设16位数字是小端
lds r0,0x100
lds r1,0x101
lds r2,0x102
lds r3,0x103
add r0,r2
adc r1,r3
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14388 次 |
| 最近记录: |