我以为0x8是十六进制,所以一个十六进制数字等于4位。在寄存器r4中,有32位,包括零。为什么第一个(左)位会掉下来,而不是只有4个?
问题是lsl r3、r4、r5,当r4=0x71AA0000和r5 = 0x8时,r3中有什么?正确的答案应该是r3 = AA000000
发布于 2022-10-07 04:41:18
这个问题还不清楚,但是如果你问为什么,请参考ARM架构参考手册中的LSL
正如他们所说:
LSL Rd,Rn,Rm 逻辑移位左移(寄存器)移动由可变位数留下的寄存器值,以零为单位,并将结果写入目标寄存器。从寄存器的底部字节读取可变位数。它可以根据结果任意更新条件标志。 Rd:目标寄存器。 Rn:第一个操作数寄存器。 Rm:其底部字节包含要移动的数量的寄存器。
因此,在您的例子中,这意味着它将执行一个算术移位,将寄存器R4中存储的值由一个存储在寄存器R5中的数字留给,并将结果放入寄存器R3中。
因此,在R4中以二进制格式存储的值是:
0111 0001 1010 1010 0000 0000 0000 0000
所以,把这个二进制数左移到0x8
倍,也就是8
倍。
结果是:
1010 1010 0000 0000 0000 0000 0000 0000
在十六进制中是0xAA000000
,该值存储在目标寄存器中,即R3。
发布于 2022-10-07 10:36:10
这是你的困惑吗?从评论来看,我认为是的。
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
0: e3a05008 mov r5, #8
4: e3a05008 mov r5, #8
8: e3a05008 mov r5, #8
13是13
c: e3a0500d mov r5, #13
10: e3a0500d mov r5, #13
14: e3a0500d mov r5, #13
17是17
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)直到这个问题.
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
给出
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支持,而且使用十六进制有点让人费解,因为没有一行)。
https://stackoverflow.com/questions/73982340
复制相似问题