Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

<opcode>   <register> <operand>   ; comment

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

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

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

или

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

cmp r1, r2
ble label7

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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

Ответ 7

Сравните два числа. Если он равен Да "Y", он выводит "Нет" на экране, если он не равен. Я использую 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

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

Ответ 8

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