Author Topic: error A2075 in jmp table  (Read 526 times)

guga

  • Member
  • *****
  • Posts: 1449
  • Assembly is a state of art.
    • RosAsm
error A2075 in jmp table
« on: February 22, 2022, 05:39:44 PM »
Hi Guys, i´m trying to asemble a routine that contains a jmp table, but it is exceeding 8 bytes, and this error came up:

FbRtl.asm(8115) : error A2075: jump destination too far : by 8 byte(s)


I tried to use the LMP command, or even used two "::" on th destination labels, but it keeps showing the error. How can i assemble this ?

Code: [Select]

.data
_achTabSpaces_7866 db '        ',0
                db    0
                db    0
                db    0
ConPrintTTY_Tbl      dd loc_40F378
                dd loc_40F360
                dd loc_40F2D0
                dd loc_40F280
                dd loc_40F3D0
                dd loc_40F3D0
                dd loc_40F220

.code

; =============== S U B R O U T I N E =======================================


                public fb_ConPrintTTY
fb_ConPrintTTY  proc near               ; CODE XREF: fb_ConsolePrintBufferEx+1BC↑p
                                        ; fb_GfxPrintBufferEx+112↓p

var_45C         = dword ptr -45Ch
var_458         = dword ptr -458h
var_454         = dword ptr -454h
var_450         = dword ptr -450h
var_44C         = dword ptr -44Ch
var_448         = dword ptr -448h
var_438         = dword ptr -438h
var_434         = dword ptr -434h
var_430         = dword ptr -430h
var_42C         = dword ptr -42Ch
var_428         = dword ptr -428h
var_424         = dword ptr -424h
var_420         = dword ptr -420h
var_41C         = byte ptr -41Ch
arg_0           = dword ptr  4
arg_4           = dword ptr  8
arg_8           = dword ptr  0Ch
arg_C           = dword ptr  10h

                push    ebp
                push    edi
                push    esi
                push    ebx
                sub     esp, 44Ch
                mov     ebp, [esp+45Ch+arg_0]
                mov     edi, [esp+45Ch+arg_4]
                mov     ecx, [esp+45Ch+arg_8]
                mov     eax, [ebp+14h]
                sub     eax, [ebp+0Ch]
                add     eax, 1
                mov     [esp+45Ch+var_420], eax
                jz      loc_40F26F
                mov     edx, [ebp+1Ch]
                test    ecx, ecx
                jz      loc_40F26F
                lea     eax, [edi+ecx]
                mov     [esp+45Ch+var_428], 0
                mov     [esp+45Ch+var_430], eax
                mov     [esp+45Ch+var_42C], 0
                mov     [esp+45Ch+var_438], 0
                mov     [esp+45Ch+var_434], edx

loc_40F200:                             ; CODE XREF: fb_ConPrintTTY+B5↓j
                movzx   eax, byte ptr [edi]
                sub     eax, 7
                cmp     al, 6           ; switch 7 cases
                ja      loc_40F3D0      ; jumptable 0040F211 default case
                movzx   eax, al
                jmp    ds:ConPrintTTY_Tbl[eax*4] ; switch jump
; ---------------------------------------------------------------------------
 

loc_40F220::                             ; CODE XREF: fb_ConPrintTTY+71↑j
                                        ; DATA XREF: .rdata:ConPrintTTY_Tbl↓o
                mov     ebx, [ebp+0Ch]  ; jumptable 0040F211 case 6
                xor     esi, esi
                sub     ebx, [esp+45Ch+var_434]

loc_40F229:                             ; CODE XREF: fb_ConPrintTTY+1D0↓j
                                        ; fb_ConPrintTTY+267↓j
                mov     edx, [esp+45Ch+var_438]
                test    edx, edx
                jnz     short loc_40F2A8

loc_40F231:                             ; CODE XREF: fb_ConPrintTTY+101↓j
                                        ; fb_ConPrintTTY+128↓j
                add     [ebp+1Ch], ebx
                mov     eax, [ebp+1Ch]
                add     [ebp+20h], esi
                mov     [esp+45Ch+var_434], eax
                mov     [esp+45Ch+var_428], 1
                mov     [esp+45Ch+var_438], 0

loc_40F24E:                             ; CODE XREF: fb_ConPrintTTY+157↓j
                                        ; fb_ConPrintTTY+1BA↓j ...
                add     edi, 1
                cmp     [esp+45Ch+var_430], edi
                jnz     short loc_40F200
                mov     ebx, [esp+45Ch+var_438]
                test    ebx, ebx
                jnz     loc_40F428
                mov     ecx, [esp+45Ch+var_428]
                test    ecx, ecx
                jnz     loc_40F450

loc_40F26F:                             ; CODE XREF: fb_ConPrintTTY+2C↑j
                                        ; fb_ConPrintTTY+37↑j ...
                add     esp, 44Ch
                pop     ebx
                pop     esi
                pop     edi
                pop     ebp
                retn
; ---------------------------------------------------------------------------


loc_40F280::                             ; CODE XREF: fb_ConPrintTTY+71↑j
                                        ; DATA XREF: .rdata:ConPrintTTY_Tbl↓o
                mov     esi, [esp+45Ch+arg_C] ; jumptable 0040F211 case 3
                test    esi, esi
                jz      loc_40F400
                mov     edx, [esp+45Ch+var_438]
                mov     ebx, [ebp+0Ch]
                mov     esi, 1
                sub     ebx, [esp+45Ch+var_434]
                test    edx, edx
                jz      short loc_40F231
                lea     esi, [esi+0]
                nop

loc_40F2A8:                             ; CODE XREF: fb_ConPrintTTY+8F↑j
                mov     eax, [esp+45Ch+var_42C]
                mov     [esp+45Ch+var_45C], ebp
                mov     [esp+45Ch+var_454], eax
                lea     eax, [esp+45Ch+var_41C]
                mov     [esp+45Ch+var_458], eax
                call    fb_ConPrintRaw
                mov     [esp+45Ch+var_42C], 0
                jmp     loc_40F231
; ---------------------------------------------------------------------------


loc_40F2D0::                             ; CODE XREF: fb_ConPrintTTY+71↑j
                                        ; DATA XREF: .rdata:ConPrintTTY_Tbl↓o
                mov     eax, [esp+45Ch+var_434] ; jumptable 0040F211 case 2
                sub     eax, [ebp+0Ch]
                lea     ebx, [eax+8]
                and     ebx, 0FFFFFFF8h
                sub     ebx, eax
                mov     eax, [esp+45Ch+var_438]
                add     eax, ebx
                cmp     eax, 400h
                ja      loc_40F3E8

loc_40F2F0:                             ; CODE XREF: fb_ConPrintTTY+24E↓j
                mov     ecx, offset _achTabSpaces_7866 ; "        "

loc_40F2F5:                             ; CODE XREF: fb_ConPrintTTY+227↓j
                test    ebx, ebx
                jz      loc_40F24E
                mov     eax, [esp+45Ch+var_438]
                lea     esi, [ebx-1]
                mov     [esp+45Ch+var_424], eax

loc_40F308:                             ; CODE XREF: fb_ConPrintTTY+27D↓j
                add     [esp+45Ch+var_434], ebx
                mov     eax, [esp+45Ch+var_434]
                cmp     eax, [ebp+14h]
                jle     short loc_40F324
                sub     eax, [ebp+0Ch]
                cdq
                idiv    [esp+45Ch+var_420]
                add     edx, [ebp+0Ch]
                mov     [esp+45Ch+var_434], edx

loc_40F324:                             ; CODE XREF: fb_ConPrintTTY+173↑j
                add     esi, [esp+45Ch+var_438]
                lea     eax, [esi+1]
                mov     [esp+45Ch+var_438], eax
                mov     eax, [esp+45Ch+var_424]
                mov     [esp+45Ch+var_424], ebx
                sub     ecx, eax
                lea     esi, [esi+0]

loc_40F340:                             ; CODE XREF: fb_ConPrintTTY+1B0↓j
                mov     edx, eax
                add     eax, 1
                movzx   ebx, byte ptr [ecx+eax-1]
                mov     byte ptr [esp+eax+45Ch+var_420+3], bl
                cmp     esi, edx
                jnz     short loc_40F340
                mov     ebx, [esp+45Ch+var_424]
                add     [esp+45Ch+var_42C], ebx
                jmp     loc_40F24E
; ---------------------------------------------------------------------------


loc_40F360::                             ; CODE XREF: fb_ConPrintTTY+71↑j
                                        ; DATA XREF: .rdata:ConPrintTTY_Tbl↓o
                xor     ebx, ebx        ; jumptable 0040F211 case 1
                mov     eax, [esp+45Ch+var_434]
                cmp     [ebp+0Ch], eax
                setl    bl
                xor     esi, esi
                neg     ebx
                jmp     loc_40F229
; ---------------------------------------------------------------------------


loc_40F378::                             ; CODE XREF: fb_ConPrintTTY+71↑j
                                        ; DATA XREF: .rdata:ConPrintTTY_Tbl↓o
                call    fb_Beep         ; jumptable 0040F211 case 0
                cmp     [esp+45Ch+var_438], 400h
                jbe     loc_40F24E
                xor     ebx, ebx

loc_40F38D:                             ; CODE XREF: fb_ConPrintTTY+243↓j
                mov     ecx, edi

loc_40F38F:                             ; CODE XREF: fb_ConPrintTTY+259↓j
                mov     eax, [esp+45Ch+var_42C]
                mov     [esp+45Ch+var_45C], ebp
                mov     [esp+45Ch+var_424], ecx
                mov     [esp+45Ch+var_454], eax
                lea     eax, [esp+45Ch+var_41C]
                mov     [esp+45Ch+var_458], eax
                call    fb_ConPrintRaw
                mov     [esp+45Ch+var_42C], 0
                mov     ecx, [esp+45Ch+var_424]
                mov     [esp+45Ch+var_438], 0
                mov     [esp+45Ch+var_428], 0
                jmp     loc_40F2F5
; ---------------------------------------------------------------------------


loc_40F3D0::                             ; CODE XREF: fb_ConPrintTTY+68↑j
                                        ; fb_ConPrintTTY+71↑j
                                        ; DATA XREF: ...
                mov     esi, [esp+45Ch+var_438] ; jumptable 0040F211 default case
                lea     eax, [esi+1]
                cmp     eax, 400h
                jbe     short loc_40F410
                mov     ebx, 1
                jmp     short loc_40F38D
; ---------------------------------------------------------------------------


loc_40F3E8:                             ; CODE XREF: fb_ConPrintTTY+14A↑j
                mov     eax, [esp+45Ch+var_438]
                test    eax, eax
                jz      loc_40F2F0
                mov     ecx, offset _achTabSpaces_7866 ; "        "
                jmp     short loc_40F38F
; ---------------------------------------------------------------------------


loc_40F400:                             ; CODE XREF: fb_ConPrintTTY+E9↑j
                xor     ebx, ebx
                mov     esi, 1
                jmp     loc_40F229
; ---------------------------------------------------------------------------
   

loc_40F410:                             ; CODE XREF: fb_ConPrintTTY+23C↑j
                mov     [esp+45Ch+var_424], esi
                mov     ecx, edi
                xor     esi, esi
                mov     ebx, 1
                jmp     loc_40F308
; ---------------------------------------------------------------------------


loc_40F428:                             ; CODE XREF: fb_ConPrintTTY+BD↑j
                mov     eax, [esp+45Ch+var_42C]
                mov     [esp+45Ch+var_45C], ebp
                mov     [esp+45Ch+var_454], eax
                lea     eax, [esp+45Ch+var_41C]
                mov     [esp+45Ch+var_458], eax
                call    fb_ConPrintRaw
                add     esp, 44Ch
                pop     ebx
                pop     esi
                pop     edi
                pop     ebp
                retn
; ---------------------------------------------------------------------------


loc_40F450:                             ; CODE XREF: fb_ConPrintTTY+C9↑j
                mov     eax, [ebp+18h]
                cmp     eax, 0FFFFFFFFh
                jz      loc_40F26F
                mov     edx, [ebp+20h]
                cmp     eax, edx
                jge     loc_40F26F
                sub     edx, eax
                mov     [esp+45Ch+var_44C], eax
                mov     [esp+45Ch+var_448], edx
                mov     eax, [ebp+14h]
                mov     [esp+45Ch+var_450], eax
                mov     eax, [ebp+10h]
                mov     [esp+45Ch+var_454], eax
                mov     eax, [ebp+0Ch]
                mov     [esp+45Ch+var_45C], ebp
                mov     [esp+45Ch+var_458], eax
                call    dword ptr [ebp+4]
                jmp     loc_40F26F
fb_ConPrintTTY  endp

The error is at
                jmp    ds:ConPrintTTY_Tbl[eax*4] ; switch jump

I tried some of these tips:
https://www.cyberforum.ru/assembler/thread1005284-page35.html
https://stackoverflow.com/questions/32706833/how-to-code-a-far-absolute-jmp-call-instruction-in-masm


But, didn´t suuceed to fix. How can this be fixed ?

Note: The beginning of he file whwre this function is called is:
Code: [Select]
; #########################################################################
;
;          Build this DLL from the batch file called BldDLL.bat
;
; #########################################################################

    .686
    .model flat, stdcall
    .xmm
option casemap :none  ; case sensitive
Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of alcoholic levels in your blood.

My Code Sites:
http://rosasm.freeforums.org
http://winasm.tripod.com

guga

  • Member
  • *****
  • Posts: 1449
  • Assembly is a state of art.
    • RosAsm
Re: error A2075 in jmp table
« Reply #1 on: February 22, 2022, 06:03:16 PM »
Fixed :)


There was 2 problems in the other file that was showing the error as if it was on this other one. :biggrin: :biggrin:
Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of alcoholic levels in your blood.

My Code Sites:
http://rosasm.freeforums.org
http://winasm.tripod.com