Assembly 用8086汇编语言编程比较两个数字
下面是我用汇编语言编写的代码,用于比较两个数字并打印一个测试字符,以确认它是否正确编写Assembly 用8086汇编语言编程比较两个数字,assembly,conditional,x86-16,Assembly,Conditional,X86 16,下面是我用汇编语言编写的代码,用于比较两个数字并打印一个测试字符,以确认它是否正确编写 DATA SEGMENT NUM1 DB 50 NUM2 DB 45 DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV AL, NUM1 MOV BL, NUM2 CMP AL, BL JLE TAG TAG: M
DATA SEGMENT
NUM1 DB 50
NUM2 DB 45
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
MOV AL, NUM1
MOV BL, NUM2
CMP AL, BL
JLE TAG
TAG: MOV DL, AL
MOV AH, 02H
MOV DL, 'T'
INT 21H
MOV AX, 4CH
INT 21H
CODE ENDS
END START
我的假设是,CMP将比较AL和BL。如果AL较小,JLE将为真,并且将执行部件“标记”中的代码。正如您所看到的,AL并没有变小,但仍然执行了TAG 我解决了
用汇编语言编写。无论是否满足条件,它都会自上而下地访问标记部分中的代码。简单地添加一个JMP命令(在标记部分开始之前)将使它在检查条件以确保给出逻辑正确的答案后直接转到终止
我的假设是,CMP会将AL与BL进行比较。如果AL较小,则JLE将为真,并将执行零件“标记”中的代码。正如您所看到的,AL并没有小,但仍然会执行标记
当我读到这篇文章时,我有点担心。我希望您知道JLE
助记符代表小于或等于时跳转。如果您只需要决定更小(似乎就是这样),那么最好使用jl
指令(如果更小,则跳转)
您的代码的真正问题(您自己已经解决了这个问题)是使用以下构造:
jcc label
label:
...
标签处的代码始终执行,因为
- 如果条件为真,则执行跳到标签处的代码
- 如果条件为false,则执行将通过标签处代码中的
cmp al, bl
jl label
jmp beyond
label:
mov ah, 02h ;Executed only is AL is smaller than BL
mov dl, 'T'
int 21h
beyond:
...
解决这个问题更简单的方法是使用相反的条件跳转绕过标签处的代码。也不再需要标签本身
对于jl
而言,相反的条件跳转是jge
(如果大于或等于跳转)对于
jle
而言,相反的条件跳转是jg
(如果跳转更大,则跳转)
关于涉及的数字的注释。 如果将数字视为有符号的数量,则使用
jl
(如果较小,则跳转)和jg
(如果较大,则跳转)是正确的方法。另一方面,如果要将数字视为无符号量,则需要使用
jb
(以下跳转)和ja
(以上跳转)指令。如果无符号较小,JLE跳转还是有符号较小?有区别吗?我不确定。我意识到一件事是,也许在这种语言中……不管条件是否满足,它都会被标记。也许需要一个JMP来确保标记只在它为真时执行。或者更简单的是,反转条件并跳过标记块。是的,请记住CPU确实从CS:PC
寄存器中的地址执行下一条指令。它们就像普通寄存器一样,只保存一些16:16位的值,PC
在指令解码后CPU如何增加它的方式上是特殊的,mov-PC,值是由jmp
完成的,而不是由mov
等等。。。但它们最终只是注册。所以要控制执行路径,必须调整PC
值<当条件满足时,code>Jcc
将使用参数中的值调整PC
,否则PC
将保持不变(在Jcc
执行期间,它已经指向下一条指令)。
cmp al, bl
jge beyond
mov ah, 02h ;Executed only is AL is smaller than BL
mov dl, 'T'
int 21h
beyond:
...