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 ?
.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 jumpI tried some of these tips:
https://www.cyberforum.ru/assembler/thread1005284-page35.htmlhttps://stackoverflow.com/questions/32706833/how-to-code-a-far-absolute-jmp-call-instruction-in-masmBut, didn´t suuceed to fix. How can this be fixed ?
Note: The beginning of he file whwre this function is called is:
; #########################################################################
;
; Build this DLL from the batch file called BldDLL.bat
;
; #########################################################################
.686
.model flat, stdcall
.xmm
option casemap :none ; case sensitive