2015-05-03 3 views
0

Мне нужно написать функцию в сборке, чтобы выполнить следующий код c.Несоответствие команд Cmp

int main(){ 

int hist[26]={0}; 
int i; 

charHistogram("This is a string", hist); 

for (i=0; i<26; i++) 
printf("%c:%d ", i+’a’, hist[i]); 
printf("\n"); 
} 

return 0; 
} 

И это сборка код, который я написал:

_charHistogram: 

push %ebp 
movl %esp,%ebp 
subl $0x10,%esp 
movl $0x0,-0x4(%ebp) 
movl $0x41,-0x8(%ebp) 

condFor1: 

movl -0x4(%ebp),%edx 
movl 0X8(%ebp),%eax 
cmp (%eax,%edx,1), $0 
je exit 

condFor2: 

cmpl $0x5a,-0x8(%ebp) 
jg condFor1 

if1: 

movl -0x8(%ebp), %ecx 
cmp (%eax,%edx,1), %ecx 
jne if2 
subl $0x41,%ecx 
movl 0xc(%ebp), %ebx 
add $0x1, (%ebx,%ecx,4) 
add 0x20,%ecx 
inc %ecx 
inc %edx 
jmp condFor1 

if2: 

add 0x20,%ecx 
cmp (%eax,%edx,2), %ecx 
jne condFor1 
subl $0x41,ecx 
movl 0xc(%ebp), %ebx 
add $0x1, (%ebx,%ecx,4) 
add 0x20,%ecx 
inc %ecx 
inc %edx 
jmp condFor1 

exit: 

leave 
ret 

В основном функция написано на ассемблере должна подсчитать количество вхождений буквы на данную строку и сохранить его в целочисленном массиве hist. Поэтому я думал, что это может сравнить каждое значение char с его значением ascii начиная с 65 до 90 и с 97 до 122. Но когда я начинаю компилировать сборку, он продолжает получать ошибку «несоответствие размера операнда для« cmp »для инструкции cmp (%eax,%edx,1), $0 , Можете ли вы мне помочь?

+0

для удобства чтения, пожалуйста, укажите исходный код C. предложите 4 пробела после открытия скобки '{' и un-indent перед закрывающей скобкой '}' – user3629249

+0

Я думаю, что точка входа должна быть объявлена. global, поэтому ее можно назвать – user3629249

ответ

1
cmp (%eax,%edx,1), $0 

Вам необходимо изменить операнды.

cmp $0, (%eax,%edx,1) 

Вы заметили, что запрограммировали бесконечные циклы?
Вы настраиваете переменную с movl $0x0,-0x4(%ebp), но вы забываете изменить ее значение на протяжении всего кода!

Поскольку ваша входная строка ASCIIZ не следует сравнивать с CL вместо сравнения с ECX?

+0

да, вы правы. это сработало. Да, я уже изменил петли, спасибо за головы. Проблема возникает, если я изменяю значение% ecx на% cl, я не могу получить позицию массива int, который я получаю с помощью добавления $ 0x1, (% ebx,% ecx, 4). i говорит, что% cl недействителен base/index –

+0

Рекомендации по изменению% ecx в% cl относятся только к инструкциям сравнения! 'cmp (% eax,% edx, 1),% cl' и' cmp (% eax,% edx, 2),% cl' Все остальные виды использования% ecx могут сохраняться. –