Проверьте наличие нулевого указателя в ассемблере ARM

#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 . Если бы вы прокомментировали свой код тем, что, по вашему мнению, должна делать каждая инструкция, я мог бы уловить это несоответствие.