2017-01-23 3 views
1

Я пытаюсь сравнить символ из Char-Array с символом в моем ассемблере.Сравнение символов (сборка 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 

Он работает для «с», но если я попробовать с «a» или «b» я всегда попадаю в ложную лабильность. Я не понимаю, почему это работает для одного из трех, а не для двух других.

+3

Вы загружаете 4 байта вместо 1. 'c' просто бывает в конце строки и, предположительно, с последующими 3 нулевых байтов случайно поэтому ваши сравнения работ , Вы должны использовать 'ldrb'. PS: научитесь использовать отладчик. Кроме того, ваш 'bx lr' никогда не достигается, так как вы' pop' в 'pc'. – 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 
Смежные вопросы