Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 问题发生变化。word到。eq_Assembly_Arm_Microcontroller_Directive_Nxp Microcontroller - Fatal编程技术网

Assembly 问题发生变化。word到。eq

Assembly 问题发生变化。word到。eq,assembly,arm,microcontroller,directive,nxp-microcontroller,Assembly,Arm,Microcontroller,Directive,Nxp Microcontroller,我正在上关于微控制器的实验课(我们使用的是FRDM-KL25Z128),我在指令.word和.eq方面遇到了问题 首先,教授给我们的示例代码旨在使FRDM板上的红色LED闪烁,如下所示: 在修改代码使三个LED同时闪烁并发出白光之前,我们需要回答一些问题,但这不是问题所在 在代码的底部,所有寄存器地址都是用.word指令定义的(因为我们使用的是32位字)。其中一个问题是回答我们是否可以将指令.word替换为.eq 我的第一个想法是,是的,我可以将.word替换为.eq,因为最后一个指令是为标签指

我正在上关于微控制器的实验课(我们使用的是FRDM-KL25Z128),我在指令.word和.eq方面遇到了问题

首先,教授给我们的示例代码旨在使FRDM板上的红色LED闪烁,如下所示:

在修改代码使三个LED同时闪烁并发出白光之前,我们需要回答一些问题,但这不是问题所在

在代码的底部,所有寄存器地址都是用.word指令定义的(因为我们使用的是32位字)。其中一个问题是回答我们是否可以将指令.word替换为.eq

我的第一个想法是,是的,我可以将.word替换为.eq,因为最后一个指令是为标签指定一个常量值,并且因为我不想更改这些标签的值,所以可以使用.eq

但当我测试它时,通过评论这些行:

SIM_SCGC5: @ Endereço do SIM_SCGC5
.word 0x40048038
和写作:

.equ SIM_SCGC5, 0x40048038
应将值0x40048038分配给SIM_SCGC5标签。但是代码不起作用,我将在以下行中得到一个错误:

ldr     r3,SIM_SCGC5
说:

偏移量无效,值太大

因此,我不确定是我在.eq指令中出错了,还是默认情况下,.eq分配的值占用的位超过了LDR可以处理的位

这里有什么问题

一些注意事项:

  • 我开始用微控制器进行汇编,所以我仍然缺少很多信息,比如硬件限制。所以我可以在不知道的情况下写一堆随机的单词

  • 对不起,准备时间太长了。我知道长文章不是堆栈溢出(或一般的堆栈交换)的最爱,但我不想在没有上下文的情况下抛出一个问题


.word
在当前位置将4个字节汇编到输出文件中。如果你想把数据存储在那里,你必须从你放数据的地址加载数据。如果在其前面放置标签,则符号的值为地址

.eq
定义一个汇编时间常数,用作将来表达式中的值。符号的值是常量,对象文件中没有地址,也没有字节。因此,您可以使用
.eq
定义的内容作为其他指令的立即操作数,如
添加
。您不能将其用于加载/存储


将立即数常量放入寄存器不同于从固定地址加载。它决定最好在r3中生成该常数。他们为这个伪操作选择了与实际加载指令相同的助记符

另见。这可能是现有SO问题的重复,但我还没有找到理想的dup目标

SIM_SCGC5
.eq
定义指令
ldr r3时,我认为SIM_SCGC5
会尝试从该绝对地址加载。您得到的错误是因为无法将其编码为单个指令

它将使用,否则将从附近的常量池返回到PC相对负载。我认为设置低16位和高16位的两条指令也是可能的


另请参见,以及各种SO问题,如。

。word
在当前位置将4个字节汇编到输出文件中。如果你想把数据存储在那里,你必须从你放数据的地址加载数据。如果在其前面放置标签,则符号的值为地址

.eq
定义一个汇编时间常数,用作将来表达式中的值。符号的值是常量,对象文件中没有地址,也没有字节。因此,您可以使用
.eq
定义的内容作为其他指令的立即操作数,如
添加
。您不能将其用于加载/存储


将立即数常量放入寄存器不同于从固定地址加载。它决定最好在r3中生成该常数。他们为这个伪操作选择了与实际加载指令相同的助记符

另见。这可能是现有SO问题的重复,但我还没有找到理想的dup目标

SIM_SCGC5
.eq
定义指令
ldr r3时,我认为SIM_SCGC5
会尝试从该绝对地址加载。您得到的错误是因为无法将其编码为单个指令

它将使用,否则将从附近的常量池返回到PC相对负载。我认为设置低16位和高16位的两条指令也是可能的

另请参见,以及各种SO问题,如此处使用的。

.word

ldr r0,hello
nop
nop
nop
hello: .word 0x12345678
类似于

unsigned int word = 0x12345678
hello:是一个标签。word与此无关。这意味着我想在这一点上使用地址标签,可以将代码或数据或任何东西放在那里。就像C中的unsigned int一样,您在程序中分配了一些空间

.eq虽然像一个定义,但您并没有分配空间,只是定义了该字符串的替换项

arm-none-eabi-as so.s -o so.o
arm-none-eabi-objdump -D so.o
...
00000000 <hello-0x10>:
   0:   e59f0008    ldr r0, [pc, #8]    ; 10 <hello>
   4:   e1a00000    nop         ; (mov r0, r0)
   8:   e1a00000    nop         ; (mov r0, r0)
   c:   e1a00000    nop         ; (mov r0, r0)
00000010 <hello>:
  10:   12345678    eorsne  r5, r4, #120, 12    ; 0x7800000
没有变化,如果我这样做

.equ JELLO, 0x12345678
ldr r0,JELLO
.equ是一个类似定义的替换

ldr r0,0x12345678

so.s: Assembler messages:
so.s:2: Error: internal_relocation (type: OFFSET_IMM) not fixed up
现在,如果我们想要r0中的值,那么这是一个语法问题

mov r0,#0x12345678
这在ARM中是做不到的,指令要么是16位,要么是32位,所以你不能有32位的立即数,操作码和寄存器,等等,32位。因此必须给出一些信息,即时数取决于指令集,变化范围在几位到11位或13位之间,正常arm mov指令全尺寸arm指令,如9位有效位

so.s: Assembler messages:
so.s:3: Error: invalid constant (12345678) after fixup
有趣的是,技巧是返回load并询问汇编程序,我想要标签的地址,而不是标签上的内容

ldr r0,=hello
nop
nop
nop
hello: .word 0x12345678
.word 0,1,2,3
汇编程序为我们分配了一个单词,在那里可以找到一个空格

00000000 <hello-0x10>:
   0:   e59f001c    ldr r0, [pc, #28]   ; 24 <hello+0x14>
   4:   e1a00000    nop         ; (mov r0, r0)
   8:   e1a00000    nop         ; (mov r0, r0)
   c:   e1a00000    nop         ; (mov r0, r0)
00000010 <hello>:
  10:   12345678    eorsne  r5, r4, #120, 12    ; 0x7800000
  14:   00000000    andeq   r0, r0, r0
  18:   00000001    andeq   r0, r0, r1
  1c:   00000002    andeq   r0, r0, r2
  20:   00000003    andeq   r0, r0, r3
  24:   00000010    andeq   r0, r0, r0, lsl r0
00000000 <hello-0x10>:
   0:   e59f001c    ldr r0, [pc, #28]   ; 24 <hello+0x14>
   4:   e1a00000    nop         ; (mov r0, r0)
   8:   e1a00000    nop         ; (mov r0, r0)
   c:   e1a00000    nop         ; (mov r0, r0)
00000010 <hello>:
  10:   12345678    eorsne  r5, r4, #120, 12    ; 0x7800000
  14:   00000000    andeq   r0, r0, r0
  18:   00000001    andeq   r0, r0, r1
  1c:   00000002    andeq   r0, r0, r2
  20:   00000003    andeq   r0, r0, r3
  24:   00000010    andeq   r0, r0, r0, lsl r0
ldr r0,=0x87654321
nop
nop
nop
hello: .word 0x12345678
.word 0,1,2,3
0000000 <hello-0x10>:
   0:   e59f001c    ldr r0, [pc, #28]   ; 24 <hello+0x14>
   4:   e1a00000    nop         ; (mov r0, r0)
   8:   e1a00000    nop         ; (mov r0, r0)
   c:   e1a00000    nop         ; (mov r0, r0)
00000010 <hello>:
  10:   12345678    eorsne  r5, r4, #120, 12    ; 0x7800000
  14:   00000000    andeq   r0, r0, r0
  18:   00000001    andeq   r0, r0, r1
  1c:   00000002    andeq   r0, r0, r2
  20:   00000003    andeq   r0, r0, r3
  24:   87654321    strbhi  r4, [r5, -r1, lsr #6]!
.equ JELLO,0x12345678
ldr r0,=JELLO
nop
nop
nop
00000000 <.text>:
   0:   e59f0008    ldr r0, [pc, #8]    ; 10 <JELLO-0x12345668>
   4:   e1a00000    nop         ; (mov r0, r0)
   8:   e1a00000    nop         ; (mov r0, r0)
   c:   e1a00000    nop         ; (mov r0, r0)
  10:   12345678    eorsne  r5, r4, #120, 12    ; 0x7800000
.equ JELLO,0x12
ldr r0,hello
mov r0,#JELLO
nop
nop
nop
hello:
.word 0x12


00000000 <hello-0x14>:
   0:   e59f000c    ldr r0, [pc, #12]   ; 14 <hello>
   4:   e3a00012    mov r0, #18
   8:   e1a00000    nop         ; (mov r0, r0)
   c:   e1a00000    nop         ; (mov r0, r0)
  10:   e1a00000    nop         ; (mov r0, r0)
00000014 <hello>:
  14:   00000012    andeq   r0, r0, r2, lsl r0
.equ JELLO,0x12
mov r0,JELLO
so.s: Assembler messages:
so.s:4: Error: immediate expression requires a # prefix -- `mov r0,JELLO'
.syntax unified
.equ JELLO,0x12
mov r0,JELLO
mov r0,#JELLO

00000000 <.text>:
   0:   e3a00012    mov r0, #18
   4:   e3a00012    mov r0, #18