wake-up-neo.com

baugruppe, um zwei Zahlen zu vergleichen

Wie lautet die Assembler-Syntax, um zu ermitteln, welche von zwei Zahlen größer ist?

Was ist die untere Ebene (Maschinencode) dafür? Können wir noch tiefer gehen? Was passiert, wenn wir die Bitebene erreicht haben? Wie wird es in 0 und 1 dargestellt?

Es variiert von Assembler zu Assembler. Die meisten Computer bieten Register an, die symbolische Namen haben. __ wie R1 oder EAX (der Intel x86) und Instruktionsnamen Wie CMP zum Vergleich. Und für eine vergleichende Anweisung Benötigen Sie einen anderen Operanden, manchmal Ein Register, manchmal ein Literal. Oft erlauben Assembler Kommentare rechts vom Unterricht.

Eine Anweisungszeile sieht folgendermaßen aus:

<opcode>   <register> <operand>   ; comment

Ihr Assembler kann etwas variieren.

Für den Microsoft X86-Assembler können Sie schreiben:

CMP EAX, 23; Vergleichen Sie das Register EAX mit der Konstanten 23

oder

CMP EAX, XYZ; Vergleichen Sie das Register EAX mit dem Inhalt des Speicherplatzes XYZ

Oft kann man komplexe "Ausdrücke" in das Operandenfeld Schreiben, die es dem Befehl ermöglichen, den Speicher auf verschiedene Arten zu adressieren, wenn er die Möglichkeit hat. Aber ich denke, das beantwortet deine Frage.

6
Ira Baxter

Zuerst wird eine CMP (Vergleichs-) Anweisung aufgerufen, dann eine der folgenden:

jle - springt zur Zeile, wenn sie kleiner oder gleich ist
jge - springt zur Zeile, wenn sie größer oder gleich ist

Der unterste Assembler arbeitet mit Bytes und nicht mit Bits (direkt trotzdem). Wenn Sie etwas über die Bit-Logik erfahren möchten, müssen Sie sich mit dem Schaltungsdesign beschäftigen.

6
Spencer Ruport

Die grundlegende Technik (bei den meisten modernen Systemen) besteht darin, die beiden Zahlen abzuziehen und dann das Vorzeichenbit des Ergebnisses zu überprüfen, d. H. Zu sehen, ob das Ergebnis größer/gleich/kleiner als Null ist. Im Assembly-Code wird das Ergebnis nicht direkt (in ein Register) abgerufen, sondern je nach Status normalerweise nur:

; 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
Edmund

Dies hängt vollständig von dem Prozessor ab, über den Sie sprechen, aber es hat die folgende Form:

cmp r1, r2
ble label7

Mit anderen Worten, eine Vergleichsanweisung zum Setzen der relevanten Flags, gefolgt von einer bedingten Verzweigung in Abhängigkeit von diesen Flags.

Dies ist im Allgemeinen so niedrig, wie Sie für die Programmierung benötigen. Sie müssen die Maschinensprache nur dafür kennen, wenn Sie Assembler schreiben, und Sie müssen nur den Mikrocode und/oder Schaltungsentwurf kennen, wenn Sie Prozessoren bauen.

4
paxdiablo

In TASM (x86 Assembly) kann es so aussehen:

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

in diesem Fall werden zwei 8-Bit-Zahlen verglichen, die wir temporär im oberen und unteren Teil des Registers B speichern. Alternativ können Sie auch die Verwendung von jbe (falls BL <= BH) oder jge/jae (falls BL> = BH) in Betracht ziehen.

Hoffentlich findet es jemand hilfreich :)

3
LihO

Wie bereits erwähnt, erfolgt der Vergleich in der Regel durch Subtraktion.
Zum Beispiel X86 Assembly/Control Flow .

Auf Hardwareebene gibt es spezielle digitale Schaltkreise für die Berechnung, wie Addierer .

1

Vergleichen Sie zwei Zahlen. Wenn es "Ja" ist, wird "Nein" auf dem Bildschirm ausgegeben, wenn es nicht gleich ist. Ich verwende emu8086. Sie können den Befehl SUB oder CMP verwenden.

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
mesutpiskin