Message board for the users of flat assembler.
> Linux > sub r8, 8 => error ?
raphi 25 Jul 2005, 14:04
i use an Athlon64 with Linux and i have an error here :
sub r8, 8
The message is
Error: not encodable with long immediate ... yes, i know !
But i don' t find the good code
could you help me ?
|25 Jul 2005, 14:04||
Feryno 26 Jul 2005, 05:55
raw opcodes for sub r8,8
db 49h, 83h, 0E8h, 8
sub r8,8 is encodable in long mode = 64 bit OS, not in 32 bit mode (you tell it to FASM by "ELF64" for Linux, "MS64 COFF" or "PE64" for win64)
You can compile on 16bit (DOS), 32 bit (win32, Linux 32 bit), 64 bit (win64, Linux 64), but for execute you need 64 bit Linux (e.g. Fedora Core 4 64 bit)
To have an AMD64 CPU isn't enough to execute, you need 64 bit OS too. But it's still enough to compile on many OS platforms supported by FASM.
My small experiences:
I have some problems in win64 with add rsp,value and sub rsp,value. Value is immediate from 20h to 78h. I don't know why. Sometimes FASM output error message "not encodable with long immediate" then I must use raw opcode (db ...), and after I add some lines to source, I can try to use add rsp,value and this is done without error message.
I see, this is your 1st post on this forum... Try Linux 64 source samples on my homepage http://feryno.host.sk . This isn't an expert stuff, but can help for somebody with start of coding in Linux64. Maybe you are an expert and you needn't this... If you aren't, you'll be !
You can find on my samples, how to debug ELF64 executables by gdb, I don't know if other free debugger for Linux 64 exist. File .gdbinit in debug directory contain the stuff needed for output registers rax,rbx,rcx,rdx,rsi,rdi,rbp,rsp every debug step, you must add here something for display r8-r15 regs if you want, or something for xmm regs, as you like.
You must remove breakpoint (db 0CCh = INT 03h) in debug/a02.fasm after finishing debug before release ELF64 for direct execute outside of debugger.
Maybe I'am lamer and breakopint can be placed by debugger after load ELF64 before execute and needn't place it in source and ELF64, but I tried this without success - maybe wrong command... I don't know gdb good enough. Place INT 03 in source and code work for me.
At the end of post is working source sample, if you can't compile it on your PC, try use
db 49h, 83h, 0E8h, 8
instead of sub r8,8
It subtract value 8 from reg r8 and then exit
You can see how r8 changes only in debugger, or add something after subtraction to display reg r8
format ELF64 executable
section readable executable writeable
xor rbx,rbx ; exit code 0
mov eax,1 ; syscall_exit number
|26 Jul 2005, 05:55||
raphi 26 Jul 2005, 07:28
thank you very much for your long post.
I am not an expert but i know your site so i could learn
I' ll try gdb and your code.
It' s not an elegant solution so it means there is a problem...
I use mandrake 10.1 on long mode. Before i worked with yasm but there is a problem with the instruction div and i don't yet succeed in changing yasm.
I am doing a library for long numbers for pleasure.
|26 Jul 2005, 07:28||
raphi 26 Jul 2005, 13:19
GREAT !!! your code "db 49h, 83h, 0E8h, 8" runs.
|26 Jul 2005, 13:19||
Tomasz Grysztar 28 Jul 2005, 15:06
The problem might actually have been caused by the bug in fasm, see this thread: http://board.flatassembler.net/topic.php?p=27932
|28 Jul 2005, 15:06||
< Last Thread | Next Thread >
Copyright © 1999-2023, Tomasz Grysztar. Also on GitHub, YouTube, Twitter.
Website powered by rwasa.