что эквивалентно оператору if в ARM?

#input #architecture #arm #division #multiplication

#ввод #архитектура #arm #разделение #умножение

Вопрос:

Итак, я работаю над программой в ARM, которая берет кучу чисел из файла и сообщает, четные они или нечетные.

Проблема в том, что я знаю, как умножить на 0,5, но я не знаю, как сделать что-то вроде этого высокоуровневого оператора в ARM

 if (A / 2 == 0)
    print even
else
    print odd
 

Вот что у меня есть с точки зрения кода:

 @open input file
ldr r0,=FileName        @ set Name for input file
mov r1,#0                 @ mode is input
swi SWI_Open              @ open file for input
bcs InFileError           @ if error?
ldr r1,=InFileHandle      @ load input file handle
str r0,[r1]               @ save the file handle

@read integers from input file
NUMBERS:
ldr r0,=InputFileHandle   @ load input file handle
ldr r0,[r0]
swi SWI_RdInt             @ read the integer into R0
bcs EofReached       @ Check Carry-Bit (C): if= 1 then EOF reached

@multiplication by 0.5 to test for odd or even
MUL R2 R0 0.5
@what is the test in ARM
@for ( R0 / 0.5 ) == a multiple of 1?

B NUMBERS
LOOP:

@end of program
Message1: .asciz"Hello World!"
EOL:     .asciz   "n"
NewL:    .ascii   "n"
Blank:   .ascii   " "
FileName: .asciz"input.txt"
.end
 

Итак, я думаю, что первые две вещи, вводимые из файла и считывающие целые числа, работают. Я не знаю, как проверить условие, что оно делится на 2. Я думаю, что это умножается на 0,5, а затем следующий шаг — сказать, даже если у этого числа нет десятичного знака с чем-либо после него в конце, но если это так, то число A, которое было разделено на число B, нечетное. В противном случае он четный?

Ответ №1:

Краткий ответ: вам не нужно умножать на 0,5 или что-то в этом роде. Вам нужно проверить значение LSB (младший значащий бит) значения. Это будет 0 для четных чисел и 1 для нечетных чисел.

Upd.: ваш код «C» также неверен. Вы хотите использовать % 2, а не A / 2

Комментарии:

1. Спасибо. Я знаю, что такое программирование, я просто забыл, потому что это было давно. Я знаю, что % — это оператор по модулю. Я просто очень устал, когда печатал это.

2. Можете ли вы прислать мне ссылку на статью, в которой говорится, как проверить значение LSB? Я хочу знать, что я делаю. Не могли бы вы привести пример?

3. Статьи нет, это элементарная операция. Если вы изучаете ARM asm, у вас есть справочное руководство по ARM, не так ли? Если нет — найдите это в Google и загрузите, это необходимо иметь. Посмотрите на инструкцию TST, или И R0, R0, # 1 — будут выполнять ту же работу, но уничтожат содержимое R0.. (PS: вы также можете отредактировать свой вопрос, чтобы исправить свои ошибки).