#assembly #arm #fgets #gnu-assembler
#собрание #рука #fgets #gnu-ассемблер
Вопрос:
Я использую вызов функции fgets() в своей ассемблерной программе arm, просматриваю содержимое файла и печатаю его. Все это работает, но я хочу выйти из программы, когда fgets() вернет значение NULL. Я тоже не могу понять, с чем я должен это сравнивать. Вот что у меня есть:
read_file: mov r2, r5 //file pointer is stored in R5 ldr r0, =buffer mov r1, #254 bl fgets bl printf cmp r0,#0 bne read_file bl exit
Я предполагаю, что мне следует проверить буфер, в который поступает строка, но, возможно, мне потребуется проверить другой регистр на предмет возврата NULL?
Комментарии:
1. Вы пробовали сравнить возвращаемое значение
fgets
сNULL
, как указано в руководстве дляfgets
? Обратите внимание, чтоNULL
это только значение0
.2. «Вы пробовали сравнить возвращаемое значение fgets с NULL, как указано в руководстве» — Вот мой вопрос в двух словах. Как мне сравнить возвращаемое значение, где хранится возвращаемое значение?
3. Обратитесь к стандарту вызова процедур ARM EABI. Возвращаемое значение хранится в
r0
. Чтобы сравнить его, используйтеcmp
инструкцию, подобную той, которой вы уже пользуетесь.
Ответ №1:
Проблема заключалась в том, что я сравнивал неправильное возвращаемое значение. Я правильно понял, что возвращаемое значение должно храниться в R0, но на самом деле я сравниваю здесь с этим кодом возвращаемое значение printf (), а не возвращаемое значение fgets (), которое уже было перезаписано в момент, когда я провожу сравнение.
bl fgets bl printf cmp r0,#0
После перемещения сравнения выше в коде и непосредственно после функции fgets() это работает.
read_file: mov r2, r5 ldr r0, =buffer mov r1, #254 bl fgets cmp r0, #0 beq exit bl printf bl read_file bl exit
Комментарии:
1. Правильно! Я думал, вы намеренно проверяете возвращаемое значение
printf
. Если бы вы прокомментировали свой код тем, что, по вашему мнению, должна делать каждая инструкция, я мог бы уловить это несоответствие.