#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: вы также можете отредактировать свой вопрос, чтобы исправить свои ошибки).