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

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

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

8 ответов


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

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

<opcode>   <register> <operand>   ; comment

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

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

CMP EAX, 23; сравните регистр EAX с константой 23

или

CMP EAX, XYZ; сравните регистр EAX с содержимым ячейки памяти с именем XYZ

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


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

; Compare r1 and r2
    CMP $r1, $r2
    JLT lessthan
greater_or_equal:
    ; print "r1 >= r2" somehow
    JMP l1
lessthan:
    ; print "r1 < r2" somehow
l1:

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

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

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


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

cmp r1, r2
ble label7

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

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


в TASM (сборка x86) это может выглядеть так:

cmp BL, BH
je EQUAL       ; BL = BH
jg GREATER     ; BL > BH
jmp LESS       ; BL < BH

в этом случае он сравнивает два 8-битных числа, которые мы временно храним в верхней и нижней части регистра B. В качестве альтернативы вы также можете рассмотреть возможность использования jbe (если BL jge/jae (Если BL >= BH).

надеюсь, кто-то найдет это полезным:)


Как уже упоминалось, обычно сравнение выполняется путем вычитания.
Например, 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

enter image description here


input password program
.modle small
.stack 100h
.data
s pasword db 34
input pasword db "enter pasword","$"
valid db ?
invalid db?
.code
mov ax, @ data 
mov db, ax
mov ah,09h
mov dx, offest s pasword
int 21h
mov ah, 01h
cmp al, s pasword
je v
jmp nv
v:
mov ah, 09h
mov dx, offset valid 
int 21h
nv:
mov ah, 09h
mov dx, offset invalid 
int 21h
mov ah, 04ch 
int 21
end