Преобразование оператора If из C в ассемблер (Motorola 68k)

Мне дали такое выражение IF:

if( (Ch > ‘g’) && (Ch < ‘m’)) || ((A>=0) && (A<=100))
    condition = 1;
else
    condition = 0;

Где Ch — это char, A — это int, а условие — это короткое целое.

Я пытаюсь перевести это на язык ассемблера как таковой:

Org $8000
CLR.W DO
CLR.W D1
CMPI.B #$67,ch
BGT ;something here...

Org   $9000
ch    DC.B  'a'
A     DC.L   0
condition  DS.W  1

Я считаю, что получил первое условие if, где 67 - это шестнадцатеричное значение для кода ascii для буквы «g». Но я понятия не имею, как реализовать оператор AND здесь, я думаю, что оператор or можно рассматривать как else? Так как либо одна часть if выполняется, либо другая. Любая помощь будет оценена по достоинству.


person user3739406    schedule 27.10.2015    source источник
comment
Попробуйте нарисовать блок-схему.   -  person Jester    schedule 27.10.2015
comment
У меня уже есть, это не совсем помогает :s   -  person user3739406    schedule 27.10.2015
comment
Если у вас действительно есть работающая блок-схема, превратить ее в ассемблер не составит труда.   -  person Jester    schedule 27.10.2015
comment
Ааа, теперь я понял, мне просто интересно, если я сравню 0 и int A, нужно ли мне использовать CMPI.L? или CMPI.B?   -  person user3739406    schedule 27.10.2015
comment
Поскольку это int, вам нужно CMPI.L   -  person Jester    schedule 27.10.2015


Ответы (1)


Если у вас действительно есть работающая блок-схема, превратить ее в ассемблер не составит труда.

Я не буду рисовать его для вас, просто дам его псевдокод:

    if Ch <= 'g' goto check_second_term
    if Ch < 'm' goto result_one

check_second_term:
    if A < 0 goto result_zero
    if A > 100 goto result_zero
result_one:
    condition := 1
    goto done
result_zero:
    condition := 0
done:

Надеюсь, вы сможете превратить их в пары cmp+bcc.

person Jester    schedule 27.10.2015
comment
Хм, только что заметил, что вы перевернули все операции, это из-за них? - person user3739406; 27.10.2015
comment
Я не стал инвертировать все :) Потому что так удобнее получалось. Для && вы можете легко увидеть, что условие не выполняется, если не выполняется какое-либо из условий. - person Jester; 27.10.2015