首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么lsl r3、r4、r5在r4=0x71AA0000和r5 = 0x8时导致r3 = AA000000?

为什么lsl r3、r4、r5在r4=0x71AA0000和r5 = 0x8时导致r3 = AA000000?
EN

Stack Overflow用户
提问于 2022-10-07 04:21:16
回答 2查看 29关注 0票数 0

我以为0x8是十六进制,所以一个十六进制数字等于4位。在寄存器r4中,有32位,包括零。为什么第一个(左)位会掉下来,而不是只有4个?

问题是lsl r3、r4、r5,当r4=0x71AA0000和r5 = 0x8时,r3中有什么?正确的答案应该是r3 = AA000000

EN

回答 2

Stack Overflow用户

发布于 2022-10-07 04:41:18

这个问题还不清楚,但是如果你问为什么,请参考ARM架构参考手册中的LSL

正如他们所说:

LSL Rd,Rn,Rm 逻辑移位左移(寄存器)移动由可变位数留下的寄存器值,以零为单位,并将结果写入目标寄存器。从寄存器的底部字节读取可变位数。它可以根据结果任意更新条件标志。 Rd:目标寄存器。 Rn:第一个操作数寄存器。 Rm:其底部字节包含要移动的数量的寄存器。

因此,在您的例子中,这意味着它将执行一个算术移位,将寄存器R4中存储的值由一个存储在寄存器R5中的数字留给,并将结果放入寄存器R3中。

因此,在R4中以二进制格式存储的值是:

代码语言:javascript
运行
复制
0111 0001 1010 1010 0000 0000 0000 0000

所以,把这个二进制数左移到0x8倍,也就是8倍。

结果是:

代码语言:javascript
运行
复制
1010 1010 0000 0000 0000 0000 0000 0000

在十六进制中是0xAA000000,该值存储在目标寄存器中,即R3

票数 0
EN

Stack Overflow用户

发布于 2022-10-07 10:36:10

这是你的困惑吗?从评论来看,我认为是的。

代码语言:javascript
运行
复制
mov r5,#8
mov r5,#0x8
mov r5,#0x00000008

mov r5,#13
mov r5,#0xD
mov r5,#0x0000000D

mov r5,#17
mov r5,#0x11
mov r5,#0x00000011


so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   e3a05008    mov r5, #8
   4:   e3a05008    mov r5, #8
   8:   e3a05008    mov r5, #8
   c:   e3a0500d    mov r5, #13
  10:   e3a0500d    mov r5, #13
  14:   e3a0500d    mov r5, #13
  18:   e3a05011    mov r5, #17
  1c:   e3a05011    mov r5, #17
  20:   e3a05011    mov r5, #17

8是8

代码语言:javascript
运行
复制
   0:   e3a05008    mov r5, #8
   4:   e3a05008    mov r5, #8
   8:   e3a05008    mov r5, #8

13是13

代码语言:javascript
运行
复制
   c:   e3a0500d    mov r5, #13
  10:   e3a0500d    mov r5, #13
  14:   e3a0500d    mov r5, #13

17是17

代码语言:javascript
运行
复制
  18:   e3a05011    mov r5, #17
  1c:   e3a05011    mov r5, #17
  20:   e3a05011    mov r5, #17

用人类可读的形式(或编程语言)表示数字所需的最小十六进制字符数与移位无关。

保持值8和13需要一个十六进制字符,但因为一咬就是4位并不重要。寄存器是32位,所以它是32位,无论是十进制8,十六进制0x8,八进制10,二进制1000,基数3 22十六进制0x0008,十六进制0x000008,十六进制0x000008,十六进制0x00000008等等。

您在编程语言中键入什么以使其在寄存器中放置一些位,is...just...what您可以在编程语言中输入,以使它在寄存器中放置一些位。如上文所示。

而且,谢谢,我从来没有尝试过在gnu汇编程序中做八进制或二进制(基2)直到这个问题.

代码语言:javascript
运行
复制
mov r5,#8
mov r5,#0x8
mov r5,#0x08
mov r5,#0x0008
mov r5,#0x00008
mov r5,#0x000008
mov r5,#0x0000008
mov r5,#0x00000008
mov r5,#010
mov r5,#0010
mov r5,#00010
mov r5,#000010
mov r5,#0000010
mov r5,#0b1000
mov r5,#0b01000
mov r5,#0b001000
mov r5,#0b0001000
mov r5,#0b00001000
mov r5,#0b000001000

给出

代码语言:javascript
运行
复制
   0:   e3a05008    mov r5, #8
   4:   e3a05008    mov r5, #8
   8:   e3a05008    mov r5, #8
   c:   e3a05008    mov r5, #8
  10:   e3a05008    mov r5, #8
  14:   e3a05008    mov r5, #8
  18:   e3a05008    mov r5, #8
  1c:   e3a05008    mov r5, #8
  20:   e3a05008    mov r5, #8
  24:   e3a05008    mov r5, #8
  28:   e3a05008    mov r5, #8
  2c:   e3a05008    mov r5, #8
  30:   e3a05008    mov r5, #8
  34:   e3a05008    mov r5, #8
  38:   e3a05008    mov r5, #8
  3c:   e3a05008    mov r5, #8
  40:   e3a05008    mov r5, #8
  44:   e3a05008    mov r5, #8
  48:   e3a05008    mov r5, #8

同样的机器代码。文本字符需要在32位register...are (文本字符)中表示我们想要的值,我们正好可以使用这个特定的工具进行选择。就像C语言一样,它在八进制之后出现一个没有b或x的前导0,在googling中搜索nasm,你可以做0o10和10q,但是arm不能做gnu汇编程序。

还请注意,例如,您所指的是一个具有18位寄存器或地址的处理器。你仍然可以在十六进制0x12345中表示,这并不是一个20位的数字,只要你把自己限制在那个上咬点的下两位,你仍然可以用十六进制来表示不是4位的倍数的数字。(是的,那些以汇编语言为基础的八进制公司有9位字节/寄存器,18或36位地址/寄存器等等,pdp-11就是其中之一,今天由gnu支持,而且使用十六进制有点让人费解,因为没有一行)。

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

https://stackoverflow.com/questions/73982340

复制
相关文章

相似问题

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