【问题标题】:JG not working as intended? (conditional branch)JG 没有按预期工作? (条件分支)
【发布时间】:2017-07-18 22:34:09
【问题描述】:

我正在尝试编写一个程序来查找两个变量中较大的一个并将答案保存在 [largest] 中。

这涉及使用分支条件。


这是我的程序:

; Find
; Gunner Stone ver 1.0 2/27/2017
;
org 100h
section .text
; beginning address of code = 0x0100
;*******************************************************
;
start:
    mov dl, [num1]
    cmp dl, [num2]
    jg assignA          ;should jump if dl is greater than [num2]
    mov dl, [num2]

assignA:
   mov   [largest], dl

infiniteLoop:
    jmp infiniteLoop
;       
;*******************************************************        
ILP:    JMP ILP             ;infinite loop
;
TIMES 50H -($-$$) DB 0
section .data
; beginning address of data = 0x0150
;*******************************************************
;
num1: db 0x0A
num2: db 0xFA
largest: db 00
;
;*******************************************************

我的问题或缺乏理解是,即使 [num1] 小于 [num2],跳转也会触发 jg assignA

如果有人能告诉我为什么会发生这种情况/我的思维缺陷在哪里,那会有所帮助!

【问题讨论】:

    标签: assembly x86 nasm dos


    【解决方案1】:

    问题在于 JG 函数将值 [num1] 和 [num2] 都视为 有符号 整数。

    如果是 JA,FA 将大于 0A


    0A 0000 1010 一个正数

    FA 1111 1010 一个负数

    所以 0A 实际上大于 FA

    【讨论】:

    • 不,不是 CMP 指令将它们视为有符号值。
    • @RossRidge 你介意解释一下,而不仅仅是说它不是 CMP?
    • 因为 CMP 可用于比较无符号和有符号值。它只是设置可以由 JG 等 Jcc 指令测试的标志。 JG 指令测试 ZF 为零且 SF 等于 OF,如果两个条件都为真则跳转。这恰好是 CMP 在第一个操作数大于第二个操作数时设置标志的原因,将两个操作数解释为有符号整数。另一方面,如果 CF = 0 且 ZF = 0,则 JA 指令跳转,这是 CMP 指令在第一个操作数高于第二个操作数时设置标志的值,两个操作数都是无符号整数。
    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2020-08-04
    相关资源
    最近更新 更多