Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 用于比较两个数字的程序集_Assembly_X86_Compare_Machine Code - Fatal编程技术网

Assembly 用于比较两个数字的程序集

Assembly 用于比较两个数字的程序集,assembly,x86,compare,machine-code,Assembly,X86,Compare,Machine Code,确定两个数字中哪一个更大的汇编程序语法是什么 它的较低级别(机器代码)是什么?我们能再低一点吗?一旦我们达到比特级,会发生什么?它在0和1中是如何表示的?首先调用CMP(比较)指令,然后调用以下指令之一: jle-如果小于或等于 jge-如果大于或等于 最低的汇编程序使用的是字节,而不是位(无论如何直接)。如果你想了解位逻辑,你需要看看电路设计。基本技术(在大多数现代系统上)是将两个数字相减,然后检查结果的符号位,即查看结果是否大于/等于/小于零。在汇编代码中,您通常只需根据状态进行分支,而不是

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

它的较低级别(机器代码)是什么?我们能再低一点吗?一旦我们达到比特级,会发生什么?它在0和1中是如何表示的?

首先调用CMP(比较)指令,然后调用以下指令之一:

jle-如果小于或等于
jge-如果大于或等于

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

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

; Compare r1 and r2
    CMP $r1, $r2
    JLT lessthan
greater_or_equal:
    ; print "r1 >= r2" somehow
    JMP l1
lessthan:
    ; print "r1 < r2" somehow
l1:
;比较r1和r2
CMP$r1,$r2
莱斯特尚酒店
大于或等于:
; 以某种方式打印“r1>=r2”
JMP-l1
莱斯特尚:
; 以某种方式打印“r1
这完全取决于您所说的处理器,但它的形式往往是:

cmp r1, r2
ble label7
换句话说,是一条设置相关标志的比较指令,后面跟着一个取决于这些标志的条件分支


这通常是编程所需的最低值。如果你在编写汇编程序,你只需要知道它的机器语言;如果你在构建处理器,你只需要知道微代码和/或电路设计。

不同的汇编程序会有所不同。 大多数机器提供具有符号名称的寄存器 与R1或EAX(Intel x86)类似,并具有指令 像“CMP”这样的名称用于比较。作为比较 指令,有时需要另一个操作数 寄存器,有时是文字。通常是汇编程序 允许在指令的右侧添加注释

指令行如下所示:

<opcode>   <register> <operand>   ; comment
;评论
您的汇编程序可能会有所不同

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

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

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

通常可以在操作数字段中写入复杂的“表达式” 使指令(如果有能力)能够 记忆有多种方式。但我认为这回答了你的问题。

正如前面提到的,通常通过减法进行比较。
例如

在硬件层面上,有专门的数字电路用于进行计算,例如。

在TASM(x86汇编)中,它可以如下所示:

cmp BL, BH
je EQUAL       ; BL = BH
jg GREATER     ; BL > BH
jmp LESS       ; BL < BH
cmp-BL,BH
je平等;BL=BH
jg更大;BL>BH
jmp-LESS;BL

在这里,它比较了登记在寄存器的较高和较低部分的两个8位数字。另外,你也可以考虑使用<代码> JBE < /C>(如果BL= BH)。


希望有人会觉得它很有用:)

比较两个数字。如果它等于是“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

在执行跳转之前,不要忘记执行CMP寄存器1、寄存器2。MOV-AX,1;移动BX,2;CMP-AX,BX;JLE某处..汇编器语法和机器代码取决于您使用的机器体系结构…谢谢,直截了当,显示出相同的大小,在您对大于等于和小于等于的注释中也看到了这并没有真正回答这个特定的问题。这些
JLT
JMP
运算符之间是否存在性能差异?在比较之后,汇编程序通常会做些什么?它会返回一个可用的值和/或将一个值存储在某个寄存器中吗?当CMP指令在大多数机器上执行时,它会产生一个结果,例如“更少”、“更大”、“相等”,并将其放入一个特殊的“条件”寄存器中。程序员通常编写一条CMP指令,后跟“JMP on condition”(例如,“JE”或“JMP equal”),该指令检查条件寄存器,并在条件为真时使程序流更改为JMP指令的tarfet。汇编程序确实需要做任何事情;一个接一个地编写指令是程序的责任。汇编程序只是将每个指令源行转换成二进制。啊,好的!谢谢你的解释。这让我想做的事情比我想象的要容易
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