Привет, я пытаюсь преобразовать эту функцию C, которую я написал в ассемблерный код (дуга SPARC), но продолжаю получать ошибку сегментации (сброс ядра). Функция должна преобразовать строку в длинное значение. Я знаю, что правильно выполнял функцию C, когда тестировал ее, и прошел все тесты. Вот функция C, которую я пытаюсь преобразовать.Преобразование функции C в сборку
long strToLong(char *str, int base)
{
char *endptr;
errno = 0;
long num;
num = strtol(str, &endptr, base);
char holder[BUFSIZ];
/*if *endptr isn't '\0' then strtol didn't get to the end of the string
*so it wasn't a valid integer*/
if(*endptr != '\0')
{
(void)fprintf(stderr, "\n\t""'%s'" " is not an integer\n", str);
return 0;
}
/*if errno isn't 0 then an error occured so print out an error message*/
else if(errno != 0)
{
(void)snprintf(holder, BUFSIZ,"\n\tConverting \"%s\" base \"%d\"\n caused an ", str, base);
perror(holder);
return 0;
}
/*if no errors, then it was a valid integer so return the integer*/
return num;
}
Вот код сборки, который я написал.
.global strToULong
.section ".data"
fmt1: .asciz "%s is not an integer\n" !ascii format
fmt2:
.asciz "Converting %s base %d\n" !ascii format
.section ".text"
strToULong:
save %sp, -(92 + 1028) & -8, %sp
add %fp, -4, %o1
mov %i0, %o0
mov %i2, %o2
call strtol
nop
mov %o0, %l0
ld [%fp - 4], %l1
ldub [%l1], %l1
cmp %l1, %g0
be errno
nop
set stdError, %o0
ld [%o0], %o0
set fmt1, %o1
mov %i0, %o2
call fprintf, 3
nop
errno:
mov %l0, %i0
set errno, %l2
ld [%l2], %l2
cmp %l2, %g0
be return
nop
add %fp, -1028, %o0
mov 1024, %o1
set fmt2, %o2
mov %i0, %o3
mov %i1, %o4
call snprintf
nop
add %fp, -1028, %o0
call perror
nop
mov 0, %i0
return:
ret
restore
Я отлаживал программу, и ошибка seg возникает, когда я вызываю функцию strtol. Я не совсем уверен, что я делаю неправильно, я думаю, что правильно передаю параметры, но до сих пор получаю эту ошибку. О, и в моем главном я получил что-то, объявленное как FILE * StdError = stderr, чтобы передать stderr как параметр fprintf.
Любая помощь будет назначена.
Вы пытались сбросить код, сгенерированный компилятором C? –
nvm, я действительно не понимаю, что вы имеете в виду. –
objdump -d yourcbinary должен предоставить вам сборку, созданную компилятором – dbrank0