web-dev-qa-db-fra.com

assemblage pour comparer deux nombres

Quelle est la syntaxe de l'assembleur pour déterminer lequel des deux nombres est le plus grand?

Quel est le niveau inférieur (code machine) pour cela? Peut-on aller encore plus bas? Une fois que nous arrivons au niveau du bit, que se passe-t-il Comment est-il représenté dans les 0 et les 1?

Cela varie d'un assembleur à l'autre ... La plupart des machines proposent des registres portant des noms symboliques comme R1, ou EAX (Intel x86), ainsi que des instructions Comme "CMP". Et pour une instruction comparée, il vous faut un autre opérande, parfois un registre, parfois un littéral. Souvent, les assembleurs Permettent des commentaires sur le droit d’instruction.

Une ligne d'instruction ressemble à:

<opcode>   <register> <operand>   ; comment

Votre assembleur peut varier quelque peu.

Pour l'assembleur Microsoft X86, vous pouvez écrire:

CMP EAX, 23; comparer registre EAX avec la constante 23

ou

CMP EAX, XYZ; compare le registre EAX avec le contenu de l’emplacement mémoire nommé XYZ

Il est souvent possible d’écrire des "expressions" complexes dans le champ opérande Qui permettent à l’instruction, si elle en a la capacité, d’adresser la mémoire de De diverses manières. Mais je pense que cela répond à votre question.

6
Ira Baxter

Une instruction CMP (comparaison) est d'abord appelée, puis l'une des suivantes:

jle - saute à la ligne si inférieur ou égal à
jge - saute à la ligne si supérieur ou égal à

L'assembleur le plus bas fonctionne avec des octets, pas des bits (directement quand même). Si vous voulez en savoir plus sur la logique des bits, vous devrez jeter un coup d'œil à la conception du circuit.

6
Spencer Ruport

La technique de base (sur la plupart des systèmes modernes) consiste à soustraire les deux nombres, puis à vérifier le bit de signe du résultat, c'est-à-dire si le résultat est supérieur/égal à/inférieur à zéro. Dans le code d'assemblage au lieu d'obtenir le résultat directement (dans un registre), vous branchez simplement en fonction de l'état:

; 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

Cela dépend entièrement du processeur dont vous parlez, mais il a plutôt la forme suivante:

cmp r1, r2
ble label7

En d'autres termes, une instruction de comparaison pour définir les indicateurs pertinents, suivie d'une branche conditionnelle en fonction de ces indicateurs.

C'est généralement aussi bas que vous devez obtenir pour la programmation. Vous ne devez connaître le langage de la machine que si vous écrivez des assembleurs et vous ne devez connaître que la conception du microcode et/ou des circuits si vous construisez des processeurs.

4
paxdiablo

Dans TASM (x86 Assembly), cela peut ressembler à ceci:

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

dans ce cas, il compare deux nombres 8 bits que nous stockons temporairement dans les parties supérieure et inférieure du registre B. Vous pouvez également envisager d'utiliser jbe (si BL <= BH) ou jge/jae (si BL> = BH).

J'espère que quelqu'un trouvera cela utile :)

3
LihO

Comme déjà mentionné, habituellement la comparaison est effectuée par soustraction.
Par exemple, X86 Assembly/Control Flow .

Au niveau matériel, il existe des circuits numériques spéciaux pour effectuer les calculs, tels que adders .

1
Nick Dandoulakis

Comparez deux nombres. S'il est égal à "Y", il affiche Non "N" sur l'écran s'il n'est pas égal. J'utilise emu8086. Vous pouvez utiliser la commande SUB ou 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
mesutpiskin