2017-01-23 39 views
1

我试图用我的程序集代码中的char字符比较Char字符。比较字符(ARM程序集)

这是C代码我用来启动汇编代码:

char a[] = "abc"; 
char b = 'a'; 
int size = 3; 

int d = _asm_main(a); 
printf("Char a: %s\n",a); 
printf("Erg:%d\n",d); 

,这是汇编代码:

_asm_main: 

push {r6,r7,r8,lr} 

mov r8,r0 

ldr r7,[r8,#2] 
mov r6,r7 
b compare 

compare: 

cmp r6,#'c' 
beq true 
b false 

true: 

mov r0,#1 
b end 

false: 

mov r0,#2 
b end 

end: 

pop {r6,r7,r8,pc} 

BX lr 

它为“C”,但如果我试试吧'a'或'b'我总是进入错误的标签。我不明白它为什么对三者中的一个起作用,而对另外两个起作用。

+3

您正在加载4个字节,而不是1'C'恰好是字符串的结束,想必后面3零个字节的机会,所以你的作品比较。你应该使用'ldrb'。 PS:学习使用调试器。另外,从弹出'pc'后,你的'bx lr'永远不会到达。 – Jester

回答

0

使用ldrb处理ASCII字节和gdb调试器的原理图。

.data 
     array:   .string "abc" 
.text 
     .global _start 
_start: 
     nop 
     ldr r0,=array 
     ldrb r1, [r0,#0] 
     ldrb r2, [r0,#1] 
     ldrb r3, [r0,#2] 
... 

GDB:

16    ldr r0,=array 
(gdb) si 
17    ldrb r1, [r0,#0] 
(gdb) 
18    ldrb r2, [r0,#1] 
(gdb) 
19    ldrb r3, [r0,#2] 
(gdb) 
_exit() at stuff.s:25 
25    mov r7, #1 
(gdb) i r 
r0    0x20094 131220 
r1    0x61  97 
r2    0x62  98 
r3    0x63  99