汇编来比较两个数字

l--*_*''' 15 x86 assembly compare machine-code

什么是汇编语法来确定两个数字中的哪一个更大?

什么是较低级别(机器代码)?我们可以走得更低吗?一旦我们达到位水平,会发生什么?它是如何用0和1表示的?

Lih*_*ihO 9

在 TASM(x86 程序集)中,它看起来像这样:

cmp BL, BH
je EQUAL       ; BL = BH
jg GREATER     ; BL > BH
jmp LESS       ; BL < BH
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它比较我们临时存储在寄存器 B 的高位和低位的两个 8 位数字。或者,您也可以考虑使用jbe(if BL <= BH) 或jge/ jae(if BL >= BH)。

希望有人觉得它有帮助:)


Ira*_*ter 7

它从汇编程序到汇编程序各不相同.大多数机器都提供寄存器,这些寄存器具有符号名称,如R1或EAX(Intel x86),并具有类似"CMP"的指令名称用于比较.对于比较指令,您需要另一个操作数,有时是寄存器,有时是文字.装配工通常允许对指令权进行评论.

指令行如下所示:

<opcode>   <register> <operand>   ; comment
Run Code Online (Sandbox Code Playgroud)

您的汇编程序可能会有所不同.

对于Microsoft X86汇编程序,您可以编写:

CMP EAX,23; 将寄存器EAX与常数23进行比较

要么

CMP EAX,XYZ; 比较寄存器EAX与名为XYZ的内存位置的内容

通常,人们可以在操作数字段中编写复杂的"表达式",如果有能力,则可以以各种方式寻址存储器.但我认为这回答了你的问题.

  • 当CMP指令执行时,在大多数机器上它产生一个结果,例如"less","greater","equal",并把它放在一个特殊的"条件"寄存器中.程序员通常写入CMP指令,然后是"JMP on condition"(例如,"JE"或"jmp equal"),它检查条件寄存器并导致程序流程变为jmp指令的tarfet如果条件为真.汇编程序必须做任何事情; 程序有责任一个接一个地写下说明书.汇编程序仅将每个指令源行转换为二进制. (2认同)

Spe*_*ort 6

首先调用CMP(比较)指令然后执行以下操作之一:

jle - 如果小于或等于
jge则跳转到行 - 如果大于或等于则跳转到行

最低的汇编程序是字节,而不是位(直接无论如何).如果你想了解位逻辑,你需要看一下电路设计.


Edm*_*und 6

基本技术(在大多数现代系统上)是减去两个数字,然后检查结果的符号位,即查看结果是否大于/等于/小于零.在汇编代码中,而不是直接获得结果(到寄存器中),通常只需根据状态进行分支:

; Compare r1 and r2
    CMP $r1, $r2
    JLT lessthan
greater_or_equal:
    ; print "r1 >= r2" somehow
    JMP l1
lessthan:
    ; print "r1 < r2" somehow
l1:
Run Code Online (Sandbox Code Playgroud)

  • 这些`JLT`和`JMP`运算符之间是否存在性能差异? (2认同)