сборка для сравнения двух чисел
Что такое синтаксис ассемблера, чтобы определить, какое из двух чисел больше?
Что такое нижний уровень (машинный код) для него? Мы можем спуститься еще ниже? Как только мы доберемся до уровня бит, что произойдет? Как он представлен в 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
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