2014-10-12 5 views
-1

Я написал код c: преобразовать целое число в строку и запятую каждые 3 цифры, и может ли кто-нибудь дать мне подсказку, как преобразовать его в ассемблере ??? Я просто хочу просто преобразовать его в ассемблере! Невозможно использовать другой вызов библиотеки!конвертировать c язык в язык ассемблера IA32

#include <stdio.h> 
char *my_itoa(int n, char *buf) 
{  
int i, j, k=0, l=0; 
char tmp[32] = {0}; 

i = n; 
do { 
    j = i%10; 
    i = i/10; 
    sprintf(tmp+k, "%d", j); 
    k++; 
    l++; 
    if (i!=0 && l%3 == 0) { 
     sprintf(tmp+k, ","); 
     k++; 
     l = 0; 
    } 
}while(i); 

for (k--,i=0; i<=k; i++) { 
    buf[i] = tmp[k-i]; 
} 

return buf;} 
+0

Подсказка: 'НКУ -S'. – interjay

+0

Вы можете скомпилировать его с помощью gcc и сбросить сгенерированную сборку с флагом -S. – VAndrei

+0

Обратите внимание, что это может быть довольно сложно, так как sprintf(), вероятно, является функцией динамической библиотеки. –

ответ

2

Если ваш компилятор является НКОЙ, this answer предлагает хороший способ, чтобы произвести объединенный файл C/ассемблера, который легче читать, чем простая сборка. Они используют C++, а просто заменить c++ с gcc:

# create assembler code: 
gcc -S -fverbose-asm -g original.c -o assembly.s 
# create asm interlaced with source lines: 
as -alhnd assembly.s > listing.lst 
0

C компиляторы, соответствующие к SUSv2 (Single Unix Specification версии 2 опубликован в 1997 году) может делать то, что вы хотите, гораздо больше, просто используя спецификатор флаг локали. Вот пример кода C, который работает с GCC:

#include <stdio.h> 
#include <locale.h> 

int main() 
{ 
    int num = 12345678; 
    setlocale(LC_NUMERIC, "en_US"); 
    printf("%'d\n", num); 
    return 0; 
} 

Печатается 12,345,678. Обратите также внимание, что это работает правильно с отрицательными номерами, пока ваш код этого не делает. Поскольку код просто один вызов библиотеки, это, вероятно, не стоит реализации на ассемблере, но если вы все-таки заботился, вы могли бы использовать это:

В разделе .rodata включить эту строковую константу:

.fmt: 
     .string "%'d\n" 

код очень прост, потому что вся тяжелая работа делается в printf:

 ; number to be converted is in %esi 
     movl $.fmt, %edi 
     movl $0, %eax 
     call printf 
Смежные вопросы