程序集跳出范围

Cak*_*ake 1 x86 assembly tasm x86-16

我正在开发汇编项目(使用 tasm),并且在跳跃时遇到了一个非常奇怪的问题,我得到的错误是:相对跳转超出范围(数字)字节,据我了解,当您尝试跳转时对于太多行,这里是(我认为)相关代码:

    IDEAL
MODEL small
STACK 100h

proc keyUsagePaint 
    mov bx,[playerSize]
    mov ah,[byte ptr keyHolder]
    push [playerX]
    pop [tempX]
    push [playerY]
    pop [tempY]
    ;Checking the key and jumping accordingly.
    keyUsageForPaint:
    cmp ah,77
    je moveRight
    cmp ah,72
    je moveUp
    cmp ah,75
    je moveLeft
    cmp ah,80
    je moveDown
    cmp ah,26
    je decBrushSize
    cmp ah,27
    je incBrushSize
    cmp ah,2
    je changeColor
    cmp ah,3
    je changeColor
    cmp ah,4
    je changeColor
    cmp ah,5
    je changeColor
    cmp ah,6
    je changeColor
    cmp ah,7
    je changeColor
    cmp ah,8
    je changeColor
    cmp ah,9
    je changeColor
    cmp ah,38
    je _loadPicture
    cmp ah,1
    je goToMenu
    jmp jumpEnd
    ;Moving the brush to the right by increasing the playerX.
    moveRight:
        add [tempX],bx
        cmp [tempX],320
        je jumpEnd
        add [playerX],bx
        jmp jumpEnd
    ;Moving the brush to the left by decreasing the playerX.
    moveLeft: 
        sub [tempX],bx
        cmp [tempX],0
        je jumpEnd
        sub [playerX],bx
        jmp jumpEnd
    ;Moving the brush to the up by decreasing the playerY.
    moveUp: 
        sub [tempY],bx
        cmp [tempY],0
        je jumpEnd
        sub [playerY],bx
        jmp jumpEnd
    ;Moving the brush to the up by increasing the playerY.
    moveDown: 
        add [tempY],bx
        cmp [tempY],200
        je jumpEnd
        add [playerY],bx
        jmp jumpEnd
    ;Increasing the brush size by increasing playerSize.
    incBrushSize: 
        cmp [playerSize],25
        je jumpEnd
        inc [playerSize]
        jmp jumpEnd
    ;Decreasing the brush size by decreasing playerSize.
    decBrushSize: 
        cmp [playerSize],1
        je jumpEnd
        dec [playerSize]
        jmp jumpEnd
    ;Changing the brush color by changing colorHolder.
    changeColor: 
        mov [colorHolder],ah
        jmp jumpEnd
    ;Going back to the menu by changing programMode.
    goBackToTheMenu:
        mov [programMode],1
        jmp jumpEnd
    ;Loading the picture using loadPicture procedures.
    _loadPicture: 
        push [keyHolder]
        call loadPicture
        pop [keyHolder]
        jmp jumpEnd
    goToMenu:
        mov [programMode],1
        call closeFile
        jmp jumpEnd
    jumpEnd:
        cmp [isLoading],1
        je _jumpRet
        cmp [keyHolder],38
        je _mainProc
        cmp [programMode],1
        je _mainProc
        call writeKeyToFile
        _mainProc:
        call MainProc
    _jumpRet:   
        ret
endp keyUsagePaint
Run Code Online (Sandbox Code Playgroud)

如果您需要更多详细信息,请告诉我您需要什么,谢谢!

Wea*_*ane 6

对于 80x86,编码的分支目标是下一条指令的 8 位有符号位移,因此目标必须位于下一条指令的 -128 ... +127 字节内。

使用相反的条件来分支经过 jmp 指令,而不是分支到(超出范围)目标。例如(你没有说哪个分支出了问题):

    cmp     ah,77
    je      moveRight       ;branch out of range?
    cmp     ah,72
Run Code Online (Sandbox Code Playgroud)

可以写成

    cmp     ah,77
    jne     notRight        ;opposite test
    jmp     moveRight
notRight:
    cmp     ah,72
Run Code Online (Sandbox Code Playgroud)

对于某些处理器(早期的 PIC?),这是唯一的选择,因为测试条件只是跳过一条指令。

编辑:在更高版本的处理器上,可以使用长分支,但该指令MODEL small表明此处情况并非如此。