2009-07-14 85 views

回答

5

从汇编器到汇编器各不相同。 大多数机器都提供寄存器,它们的符号名称为 ,如R1或EAX(Intel x86),并且指令 名称(如“CMP”)用于比较。而对于 指令的比较,则需要另一个操作数,有时候是 一个寄存器,有时是一个文字。经常汇编器 允许评论的权利的指示。

一个指令行的样子:

<opcode> <register> <operand> ; comment 

你的汇编程序可能会有所变化。

对于微软X86汇编程序,你可以写:

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

CMP EAX,XYZ;将寄存器EAX与名为XYZ的存储器位置的内容进行比较。通常,人们可以在操作数字段 中编写复杂的“表达式”,使得该指令能够以多种方式寻址内存地址 。但我认为这回答你的问题。

+0

比较之后,汇编程序通常会做什么?它会返回一个可用的值,和/或将值存储在某个寄存器中吗? – 2016-09-17 23:58:46

+2

执行CMP指令时,在大多数机器上产生一个结果,例如“less”,“greater”,“equal”并将其放入特殊的“条件”寄存器中。程序员通常会写入一条CMP指令,然后写入“JMP on condition”(例如“JE”或“jmp equal”),检查条件寄存器并在条件为真时使程序流程改变为jmp指令的tarfet 。汇编器必须做任何事情;程序的责任是一个接一个地写指令。汇编器仅将每个指令源代码行转换为二进制代码。 – 2016-09-18 04:01:38

+0

啊好的!感谢您的解释。这使得我想要做的事比我想象的要容易 – 2016-09-19 12:54:48

4

首先一个CMP(比较)指令被称为然后执行下列操作之一:

JLE - 跳转到行,如果小于或等于
JGE - 跳转到行,如果大于或等于

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

+0

不要忘记做跳跃前做CMP寄存器1,寄存器2。 MOV AX,1; MOVE BX,2; CMP AX,BX; JLE在某处.. – 2009-07-14 04:19:54

4

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

; Compare r1 and r2 
    CMP $r1, $r2 
    JLT lessthan 
greater_or_equal: 
    ; print "r1 >= r2" somehow 
    JMP l1 
lessthan: 
    ; print "r1 < r2" somehow 
l1: 
+0

这些`JLT`和`JMP`运营商之间有任何性能差异吗? – rejnev 2016-07-27 09:21:59

4

这完全取决于你在谈论的处理器上,但它往往是的形式:

cmp r1, r2 
ble label7 

换句话说,一个比较指令来设置相关的标志,后面跟着一个条件分支根据这些标志。

这通常与您需要编程时一样低。如果你正在编写汇编器,你只需要知道机器语言,如果你正在构建处理器,你只需要知道微代码和/或电路设计。

1

如前所述,通常是比较是通过减法完成的。
例如,X86 Assembly/Control Flow

在硬件层面有用于计算的特殊数字电路,如adders

3

在TASM(x86汇编),它可以是这样的:

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

在这种情况下比较,我们暂时在较高和寄存器B的下部或者你可以存储2个8位数字也考虑使用jbe(如果BL < = BH)或jge/jae(如果BL> = BH)。

希望有人发现它有帮助:)

-2
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 
0

比较两个数字。如果它等于是“是”,则它在屏幕上不打印“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 

enter image description here