【问题标题】:Difference between JA and JG in assemblyJA和JG在汇编中的区别
【发布时间】:2014-01-21 07:11:07
【问题描述】:

您能告诉我汇编语言中 JUMP IF ABOVEJUMP IF GREATER 之间的区别吗?我什么时候使用它们?他们会给我不同的结果吗?

【问题讨论】:

标签: assembly x86 conditional-statements


【解决方案1】:

作为Intel's manual explains,JG 将标志解释为比较有符号,而 JA 将标志解释为比较无符号(当然,如果设置标志的操作不是比较或减法,那可能不是有道理)。所以是的,它们是不同的。准确地说,

  • 如果CF = 0ZF = 0ja 跳转(以上无符号:无进位且不等于)
  • jg 如果 SF = OFZF = 0 则跳转(有符号大于,不包括相等)

例如,

cmp eax, edx
ja somewhere ; will go "somewhere" if eax >u edx
             ; where >u is "unsigned greater than"

cmp eax, edx
jg somewhere ; will go "somewhere" if eax >s edx
             ; where >s is "signed greater than"

>u>s 同意最高位为零的值,但设置最高位的值被>s 视为负数,>u 视为大(当然,如果两个操作数都有最高位位设置,>u>s 再次同意)。

【讨论】:

  • 你能给我举个例子吗?这是否意味着 JA 忽略了负号?
  • @user3157687 没有任何迹象。只有条件标志。 ja 虽然忽略了符号标志 (SF)。传入示例..
  • 对不起,你是什么意思?:)
  • @user3157687 未签名和已签名
  • @user3157687 不,如果你有cmp 5, -6 \ ja somewhere(忽略语法错误),它不会跳转(你是对的),但原因是-6(又名0xfffffffa)很多大于 5,并不是说 6 大于 5。cmp 5, -1 也不会跳,-1 甚至大于 -6。当然是“未签名的更大”。
【解决方案2】:

JA 用于如果最后一个“标志更改”指令是针对无符号数进行跳转。但另一方面,JG 用于跳转,如果最后一个“标志更改”指令是在有符号数上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2016-10-11
    • 2020-03-03
    • 1970-01-01
    相关资源
    最近更新 更多