2017-01-23 8 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'と一緒に私はいつも虚偽のlableに入ります。なぜ私は3つのうちの1つでは動作し、他の2つでは動作しません。

+3

あなたは1ではなく 'C'の4つのバイトをロードしているだけで、文字列の末尾にあることを起こると、おそらく偶然3ゼロのバイトので、あなたの比較作品が続きます。 'ldrb'を使うべきです。 PS:デバッガの使い方を学んでください。また、あなたの 'bx lr'は、' pop'を 'pc'に入れたので決して到達しません。 – Jester

答えて

0

ASCIIバイトとgdbデバッガを処理するためにldrbを使用した粗い図です。

.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