分区MASM错误 - 在短距离内跳跃

时间:2014-05-28 14:21:18

标签: assembly division masm

我无法弄清楚或找不到任何信息,为什么我在编译代码时遇到错误

loop1:
mov edx, 0 ; reset EDX which contains the remainder
XOR ECX,  ECX   ;reset ECX
MOV EDX, EAX
MOV EBX, NUM2   ;num2 = 10, so copy 10 to EBX
CMP EAX, EBX
JNG nextStep
Division:
    SUB EAX, EBX    ; EAX-10
    INC ECX
    CMP EAX, EBX
    JG Division
nextStep:
MOV EDX, EAX        ;move reminder to EDX
MOV EAX, ECX        ;move result of division to EAX
push dx ; save it to stock so to display int he proper order
inc count ; count how many pushes of stack
cmp Eax,0 ; check if the div ends
JL loop1

我从编译器得到的错误是:

 008F  0F 8E 009D R                     JNG nextStep
 fib2.ASM(67): warning A5104: Jump within short distance

  49798 + 451946 Bytes symbol space free

  1 Warning Errors
  0 Severe  Errors

2 个答案:

答案 0 :(得分:1)

即使跳转距离仅为14个字节0F 8E,编译器似乎也使用了JNG的近跳转操作码008F->009D。如果您明确使用JNG Short nextStep,则应生成短跳转操作码7E。这仅仅是效率较低的问题。它不应该影响实际结果。

答案 1 :(得分:1)

这是对低效代码的警告,而不是错误。

以下是警告意味着什么的复制粘贴说明:

  

JMP指令用于跳转到short标签(128或   JMP指令结束前的字节数减少,或127或   超出指令的字节数)。默认情况下是汇编程序   假设跳转为near(大于short,但仍然在一个中   分割)。如果遇到short跳转,则masm使用短路   JMP指令的形式(2个字节)而不是long   形式(3个字节,16位段或5个字节,32位段)   发言:)。您可以通过以下方式提高代码效率   使用SHORT运算符指定跳转为short   而不是near。例如,使用SHORT运算符   以下示例保存1个字节的代码:

     

jrrp SHORT there

     

there: . ; Less than 127 bytes

     

使用80386处理器,这也适用于有条件的   跳转,可以是短(2字节)或近(4字节)。