确定两个数字中哪个更大的汇编语法是什么?
它的较低级别(机器代码)是什么?我们还能再低一点吗?一旦我们到达比特级别,会发生什么?它是如何用 0 和 1 表示的?
确定两个数字中哪个更大的汇编语法是什么?
它的较低级别(机器代码)是什么?我们还能再低一点吗?一旦我们到达比特级别,会发生什么?它是如何用 0 和 1 表示的?
在 TASM(x86 程序集)中,它可能如下所示:
cmp BL, BH
je EQUAL ; BL = BH
jg GREATER ; BL > BH
jmp LESS ; BL < BH
在这种情况下,它比较我们临时存储在寄存器 B 的较高和较低部分的两个 8 位数字。或者,您也可以考虑使用jbe
(if BL <= BH) 或jge
/ jae
(if BL >= BH)。
希望有人觉得它有帮助:)
首先调用 CMP(比较)指令,然后调用以下指令之一:
jle - 如果小于或等于
则跳到行 jge - 如果大于或等于则跳到行
最低的汇编程序使用的是字节,而不是位(无论如何直接)。如果您想了解位逻辑,则需要查看电路设计。
它因汇编程序而异。大多数机器提供寄存器,其符号名称如 R1 或 EAX(Intel x86),指令名称如“CMP”用于比较。对于比较指令,您需要另一个操作数,有时是寄存器,有时是文字。汇编程序通常允许在指令右侧添加注释。
指令行如下所示:
<opcode> <register> <operand> ; comment
您的汇编程序可能会有所不同。
对于 Microsoft X86 汇编器,您可以编写:
CMP EAX,23;将寄存器 EAX 与常数 23 进行比较
或者
CMP EAX, XYZ ; 将寄存器 EAX 与名为 XYZ 的内存位置的内容进行比较
通常可以在操作数字段中编写复杂的“表达式”,使指令(如果有能力)能够以各种方式寻址内存。但我认为这回答了你的问题。
基本技术(在大多数现代系统上)是将两个数字相减,然后检查结果的符号位,即查看结果是否大于/等于/小于零。在汇编代码中,您通常只是根据状态进行分支,而不是直接获取结果(进入寄存器):
; Compare r1 and r2
CMP $r1, $r2
JLT lessthan
greater_or_equal:
; print "r1 >= r2" somehow
JMP l1
lessthan:
; print "r1 < r2" somehow
l1:
这完全取决于您正在谈论的处理器,但它往往是以下形式:
cmp r1, r2
ble label7
换句话说,设置相关标志的比较指令,然后是取决于这些标志的条件分支。
这通常与您进行编程所需的一样低。如果你正在编写汇编程序,你只需要知道它的机器语言,如果你正在构建处理器,你只需要知道微码和/或电路设计。
如前所述,通常比较是通过减法完成的。
例如,X86 汇编/控制流。
在硬件层面,有专门的数字电路来进行计算,比如加法器。
input password program
.modle small
.stack 100h
.data
s pasword db 34
input pasword db "enter pasword","$"
valid db ?
invalid db?
.code
mov ax, @ data
mov db, ax
mov ah,09h
mov dx, offest s pasword
int 21h
mov ah, 01h
cmp al, s pasword
je v
jmp nv
v:
mov ah, 09h
mov dx, offset valid
int 21h
nv:
mov ah, 09h
mov dx, offset invalid
int 21h
mov ah, 04ch
int 21
end