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.
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.
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:
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.
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 :)
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 .
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