2017-01-23 1 views
1

문자 배열에서 문자를 내 어셈블리 코드의 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 명 중 한 명에게는 효과가 있는지 얻지 못합니다.

+3

. 'ldrb'를 사용해야합니다. 추신 : 디버거를 사용하는 법을 배워보십시오. 또한'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 : 바로 문자열의 끝에서 수와 비교 작품, 그래서 아마도 우연히 3 0 바이트 다음에 할 일이 당신은 1 대신`c`의 4 바이트를로드

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