Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 用8086汇编语言编程比较两个数字_Assembly_Conditional_X86 16 - Fatal编程技术网

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:
    ...