首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么lsl和lsr函数会导致SREG中的这些标志

为什么lsl和lsr函数会导致SREG中的这些标志
EN

Stack Overflow用户
提问于 2020-05-30 21:52:59
回答 1查看 355关注 0票数 0

给定下列组装代码:

代码语言:javascript
复制
ldi     r26, 0x00
ldi     r27, 0x01
ldi     r30, 0xAC
lsl     r30
lsr     r30
asr     r30

在lsl操作之后,立即升起H、S、V和C SREG标志。我不明白为什么。我知道,当lsl操作将位移到左边时,该位7将升起C标志。我不明白的是为什么其他三面旗帜会升起。

根据atmel教学手册,lsl有效地将值乘以2。如果r30以0xAC (172)开始,那么为什么lsl使其为0x58 (88)。这也是所有旗帜升起的地方。

在这个操作之后,我理解为什么其他的操作都是这样做的,因为lsr和asr都有效地除以值2。在lsr操作之后,r30是44,在asr操作之后,r30是22。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-30 22:05:38

因为您的寄存器是8位,所以向左移动0xAC会损失一点。0xAC * 2 = 0x158,但是1丢失了(在进位标志中)。剩下的当然是您正在看到的0x58。这些标志被记录在指令集引用中如下:

H: Rd3 C: Rd7 N:如果设置了结果的MSB,则设置;否则清除。 V: n×C S: n×V

Rd3是输入操作数的第3位。它被设置好了,所以H = 1

Rd7是输入操作数的第7位。它被设置好了,所以C = 1

MSB的结果是不设置的,所以N = 0

V = N xor C = 0 xor 1 = 1

S = N xor V = 0 xor 1 = 1

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62109117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档