сборка для сравнения двух чисел

Каков синтаксис ассемблера для определения того, какое из двух чисел больше?

Какой у него нижний уровень (машинный код)? Можем ли мы пойти еще ниже? Как только мы доберемся до битового уровня, что произойдет? Как это представлено в 0 и 1?


person Alex Gordon    schedule 14.07.2009    source источник
comment
Синтаксис ассемблера и машинный код зависят от используемой архитектуры машины...   -  person Stobor    schedule 14.07.2009


Ответы (8)


Он варьируется от ассемблера к ассемблеру. Большинство машин предлагают регистры, которые имеют символические имена, такие как R1 или EAX (Intel x86), и имеют имена инструкций, такие как «CMP» для сравнения. А для инструкции сравнения нужен другой операнд, иногда регистр, иногда литерал. Часто ассемблеры допускают комментарии справа от инструкций.

Строка инструкции выглядит так:

<opcode>   <register> <operand>   ; comment

Ваш ассемблер может несколько отличаться.

Для ассемблера Microsoft X86 вы можете написать:

СМР ЕАХ, 23 ; сравнить регистр EAX с константой 23

or

CMP EAX, XYZ ; сравнить регистр EAX с содержимым области памяти с именем XYZ

Часто в поле операнда можно написать сложные «выражения», которые позволяют инструкции, если она имеет возможность, обращаться к памяти различными способами. Но я думаю, что это ответ на ваш вопрос.

person Ira Baxter    schedule 14.07.2009
comment
Что обычно делает ассемблер после сравнения? Будет ли он возвращать значение, которое можно использовать, и/или сохранять значение в определенном регистре? - person Mahmud Ahmad; 18.09.2016
comment
Когда инструкция CMP выполняется, на большинстве машин она выдает результат, например, меньше, больше, равно и помещает его в регистр специальных условий. Программист обычно пишет инструкцию CMP, за которой следует JMP при условии (например, JE или jmp равно), которая проверяет регистр условий и вызывает изменение потока программы на цель инструкции jmp, если условие истинно. Ассемблер должен что-то делать; программа несет ответственность за написание инструкций одну за другой. Ассемблер просто преобразует каждую строку исходного кода инструкции в двоичный код. - person Ira Baxter; 18.09.2016
comment
Ах хорошо! Спасибо за объяснение. Это делает то, что я хочу сделать, проще, чем я думал - person Mahmud Ahmad; 19.09.2016

Сначала вызывается инструкция CMP (сравнение), затем одна из следующих:

jle — перейти на строку, если меньше или равно
jge — перейти на строку, если больше или равно

Низший ассемблер работает с байтами, а не с битами (во всяком случае, напрямую). Если вы хотите узнать о битовой логике, вам нужно взглянуть на схему.

person Spencer Ruport    schedule 14.07.2009
comment
не забудьте сделать CMP register1, register2 перед выполнением прыжка. ДВИГАТЕЛЬ ОСЬ, 1; ПЕРЕМЕЩЕНИЕ ВХ, 2; ЦМП AX, BX; JLE где-то.. - person Jimmy Chandra; 14.07.2009

В 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).

Надеюсь, кому-то будет полезно :)

person LihO    schedule 07.09.2013
comment
Спасибо, прямо вперед, показывая равно больше, меньше, также только что видел в ваших комментариях больше, чем равно и меньше, чем равно - person CTS_AE; 11.10.2013

Основной метод (в большинстве современных систем) состоит в том, чтобы вычесть два числа, а затем проверить бит знака результата, т.е. посмотреть, больше ли результат/равен/меньше нуля. В ассемблерном коде вместо того, чтобы получать результат напрямую (в регистр), вы обычно просто переходите в зависимости от состояния:

; Compare r1 and r2
    CMP $r1, $r2
    JLT lessthan
greater_or_equal:
    ; print "r1 >= r2" somehow
    JMP l1
lessthan:
    ; print "r1 < r2" somehow
l1:
person Edmund    schedule 14.07.2009
comment
Есть ли разница в производительности между этими операторами JLT и JMP? - person Bagherani; 27.07.2016

Это полностью зависит от процессора, о котором вы говорите, но обычно имеет форму:

cmp r1, r2
ble label7

Другими словами, инструкция сравнения для установки соответствующих флагов, за которой следует условный переход в зависимости от этих флагов.

Как правило, это настолько низко, насколько вам нужно для программирования. Вам нужно знать только машинный язык для этого, если вы пишете ассемблеры, и вам нужно знать только микрокод и / или схемы, если вы строите процессоры.

person paxdiablo    schedule 14.07.2009

Как уже упоминалось, обычно сравнение выполняется путем вычитания.
Например, Поток сборки/управления X86.

На аппаратном уровне существуют специальные цифровые схемы для выполнения вычислений, такие как сумматоры.

person Nick Dandoulakis    schedule 14.07.2009

Сравните два числа. Если он равен Да "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

введите здесь описание изображения

person mesutpiskin    schedule 30.11.2016

person    schedule
comment
Это на самом деле не отвечает на этот конкретный вопрос. - person Unihedron; 07.09.2014