ARM 程序集 - CMP 错误输出
ARM Assembly - CMP wrong output
我正在使用 ARM 汇编 (Raspberry pi) 编写程序,但我遇到了问题。
我有这段代码,但是下半部分一直在执行(skip$)。
mov r1, #3
mov r3, #4
add r2, r1, r3
bl Debug
cmp r2, #0x0A
ble skip$
mov r0, #10
sub r0, r0, r1
mov r3, r0
bl Debug
skip$:
我错过了什么?
调试功能只是通过 UART 将 r0 - r4 发送到我的电脑。
当我运行这个的时候,最后r3是7,应该还是4。
提前致谢
劳伦斯·伍兹
编辑:
这是使用的其他功能。
Debug:
push {r0 - r4, lr}
mov r4, r0
mov r0, #10
bl UART_write
mov r0, r4
bl UART_write
mov r0, #11
bl UART_write
mov r0, r1
bl UART_write
mov r0, #12
bl UART_write
mov r0, r2
bl UART_write
mov r0, #13
bl UART_write
mov r0, r3
bl UART_write
pop {r0 - r4, pc}
UART_write:
push {r0 - r2, lr}
ldr r1, =UART0_FR
wait_write$:
ldr r2, [r1]
tst r2, #0x20
bne wait_write$
ldr r1, =UART0_DR
and r0, #0x000000ff
str r0, [r1]
pop {r0 - r2, pc}
第二次编辑:
我已经使用这段代码来设置堆栈指针。
setup_stack:
mov r0, #0xD1 @ FIQ
msr cpsr, r0
ldr sp, =stack_fiq
mov r0, #0xD2 @ IRQ
msr cpsr, r0
ldr sp, =stack_irq
mov r0, #0xD7 @ ABT
msr cpsr, r0
ldr sp, =stack_abt
mov r0, #0xDB @ UND
msr cpsr, r0
ldr sp, =stack_und
mov r0, #0xDF @ SYS
msr cpsr, r0
ldr sp, =stack_sys
mov r0, #0xD3 @ SVC
msr cpsr, r0
ldr sp, =stack_svc
mov pc, lr
这是我的链接器:
.= ALIGN(0x1000);
/* Stack space */
. = . + 0x800;
stack_svc = .;
. = . + 0x800;
stack_und = .;
. = . + 0x800;
stack_abt = .;
. = . + 0x800;
stack_irq = .;
. = . + 0x800;
stack_fiq = .;
. = . + 0x400000;
stack_sys = .;
所以我创建了这个函数来测试它。
.globl TEST
TEST:
mov r1, #3
mov r3, #4
add r2, r1, r3
cmp r2, #0x0A
ble skip
mov r0,#0x30
bx lr
skip:
mov r0,#0x31
bx lr
然后我将结果 (r0) 发送到 uart。并得到一个0x31出来(数字1),不出所料,7小于10.
这是 raspberry pi A+。
当您使用相同的代码时,您会得到什么?
我找到了这个问题的问题(和答案)。
问题是,我正在使用 ldr 从地址中读取一个字节,所以输出字的前 24 位有一些垃圾。
我应该使用 ldrb(加载字节)而不是 ldr。
UART0_write函数只发送寄存器的最低字节,所以看起来是正确的。
劳伦斯
我正在使用 ARM 汇编 (Raspberry pi) 编写程序,但我遇到了问题。
我有这段代码,但是下半部分一直在执行(skip$)。
mov r1, #3
mov r3, #4
add r2, r1, r3
bl Debug
cmp r2, #0x0A
ble skip$
mov r0, #10
sub r0, r0, r1
mov r3, r0
bl Debug
skip$:
我错过了什么?
调试功能只是通过 UART 将 r0 - r4 发送到我的电脑。
当我运行这个的时候,最后r3是7,应该还是4。
提前致谢
劳伦斯·伍兹
编辑: 这是使用的其他功能。
Debug:
push {r0 - r4, lr}
mov r4, r0
mov r0, #10
bl UART_write
mov r0, r4
bl UART_write
mov r0, #11
bl UART_write
mov r0, r1
bl UART_write
mov r0, #12
bl UART_write
mov r0, r2
bl UART_write
mov r0, #13
bl UART_write
mov r0, r3
bl UART_write
pop {r0 - r4, pc}
UART_write:
push {r0 - r2, lr}
ldr r1, =UART0_FR
wait_write$:
ldr r2, [r1]
tst r2, #0x20
bne wait_write$
ldr r1, =UART0_DR
and r0, #0x000000ff
str r0, [r1]
pop {r0 - r2, pc}
第二次编辑: 我已经使用这段代码来设置堆栈指针。
setup_stack:
mov r0, #0xD1 @ FIQ
msr cpsr, r0
ldr sp, =stack_fiq
mov r0, #0xD2 @ IRQ
msr cpsr, r0
ldr sp, =stack_irq
mov r0, #0xD7 @ ABT
msr cpsr, r0
ldr sp, =stack_abt
mov r0, #0xDB @ UND
msr cpsr, r0
ldr sp, =stack_und
mov r0, #0xDF @ SYS
msr cpsr, r0
ldr sp, =stack_sys
mov r0, #0xD3 @ SVC
msr cpsr, r0
ldr sp, =stack_svc
mov pc, lr
这是我的链接器:
.= ALIGN(0x1000);
/* Stack space */
. = . + 0x800;
stack_svc = .;
. = . + 0x800;
stack_und = .;
. = . + 0x800;
stack_abt = .;
. = . + 0x800;
stack_irq = .;
. = . + 0x800;
stack_fiq = .;
. = . + 0x400000;
stack_sys = .;
所以我创建了这个函数来测试它。
.globl TEST
TEST:
mov r1, #3
mov r3, #4
add r2, r1, r3
cmp r2, #0x0A
ble skip
mov r0,#0x30
bx lr
skip:
mov r0,#0x31
bx lr
然后我将结果 (r0) 发送到 uart。并得到一个0x31出来(数字1),不出所料,7小于10.
这是 raspberry pi A+。
当您使用相同的代码时,您会得到什么?
我找到了这个问题的问题(和答案)。
问题是,我正在使用 ldr 从地址中读取一个字节,所以输出字的前 24 位有一些垃圾。
我应该使用 ldrb(加载字节)而不是 ldr。
UART0_write函数只发送寄存器的最低字节,所以看起来是正确的。
劳伦斯