сборка для сравнения двух чисел - PullRequest
15 голосов
/ 14 июля 2009

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

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

Ответы [ 8 ]

6 голосов
/ 14 июля 2009

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

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

<opcode>   <register> <operand>   ; comment

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

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

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

или

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

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

6 голосов
/ 14 июля 2009

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

; Compare r1 and r2
    CMP $r1, $r2
    JLT lessthan
greater_or_equal:
    ; print "r1 >= r2" somehow
    JMP l1
lessthan:
    ; print "r1 < r2" somehow
l1:
6 голосов
/ 14 июля 2009

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

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

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

4 голосов
/ 14 июля 2009

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

cmp r1, r2
ble label7

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

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

3 голосов
/ 07 сентября 2013

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

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

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

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

1 голос
/ 14 июля 2009

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

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

0 голосов
/ 30 ноября 2016

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

0 голосов
/ 07 сентября 2014
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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...