Каков синтаксис ассемблера для определения того, какое из двух чисел больше?
Какой у него нижний уровень (машинный код)? Можем ли мы пойти еще ниже? Как только мы доберемся до битового уровня, что произойдет? Как это представлено в 0 и 1?
Каков синтаксис ассемблера для определения того, какое из двух чисел больше?
Какой у него нижний уровень (машинный код)? Можем ли мы пойти еще ниже? Как только мы доберемся до битового уровня, что произойдет? Как это представлено в 0 и 1?
Он варьируется от ассемблера к ассемблеру. Большинство машин предлагают регистры, которые имеют символические имена, такие как R1 или EAX (Intel x86), и имеют имена инструкций, такие как «CMP» для сравнения. А для инструкции сравнения нужен другой операнд, иногда регистр, иногда литерал. Часто ассемблеры допускают комментарии справа от инструкций.
Строка инструкции выглядит так:
<opcode> <register> <operand> ; comment
Ваш ассемблер может несколько отличаться.
Для ассемблера Microsoft X86 вы можете написать:
СМР ЕАХ, 23 ; сравнить регистр EAX с константой 23
or
CMP EAX, XYZ ; сравнить регистр EAX с содержимым области памяти с именем XYZ
Часто в поле операнда можно написать сложные «выражения», которые позволяют инструкции, если она имеет возможность, обращаться к памяти различными способами. Но я думаю, что это ответ на ваш вопрос.
Сначала вызывается инструкция CMP (сравнение), затем одна из следующих:
jle — перейти на строку, если меньше или равно
jge — перейти на строку, если больше или равно
Низший ассемблер работает с байтами, а не с битами (во всяком случае, напрямую). Если вы хотите узнать о битовой логике, вам нужно взглянуть на схему.
В TASM (сборка x86) это может выглядеть так:
cmp BL, BH
je EQUAL ; BL = BH
jg GREATER ; BL > BH
jmp LESS ; BL < BH
в этом случае он сравнивает два 8-битных числа, которые мы временно храним в старшей и младшей части регистра B. В качестве альтернативы вы также можете рассмотреть возможность использования jbe
(если BL ‹= BH) или jge
/jae
(если BL >= BH).
Надеюсь, кому-то будет полезно :)
Основной метод (в большинстве современных систем) состоит в том, чтобы вычесть два числа, а затем проверить бит знака результата, т.е. посмотреть, больше ли результат/равен/меньше нуля. В ассемблерном коде вместо того, чтобы получать результат напрямую (в регистр), вы обычно просто переходите в зависимости от состояния:
; Compare r1 and r2
CMP $r1, $r2
JLT lessthan
greater_or_equal:
; print "r1 >= r2" somehow
JMP l1
lessthan:
; print "r1 < r2" somehow
l1:
JLT
и JMP
?
- person Bagherani; 27.07.2016
Это полностью зависит от процессора, о котором вы говорите, но обычно имеет форму:
cmp r1, r2
ble label7
Другими словами, инструкция сравнения для установки соответствующих флагов, за которой следует условный переход в зависимости от этих флагов.
Как правило, это настолько низко, насколько вам нужно для программирования. Вам нужно знать только машинный язык для этого, если вы пишете ассемблеры, и вам нужно знать только микрокод и / или схемы, если вы строите процессоры.
Как уже упоминалось, обычно сравнение выполняется путем вычитания.
Например, Поток сборки/управления X86.
На аппаратном уровне существуют специальные цифровые схемы для выполнения вычислений, такие как сумматоры.
Сравните два числа. Если он равен Да "Y", он печатает Нет "N" на экране, если он не равен. Я использую emu8086. Вы можете использовать команду SUB или CMP.
MOV AX,5h
MOV BX,5h
SUB AX,BX
JZ EQUALS
JNZ NOTEQUALS
EQUALS:
MOV CL,'Y'
JMP PRINT
NOTEQUALS:
MOV CL,'N'
PRINT:
MOV AH,2
MOV DL,CL
INT 21H
RET