fasm: the program updated to 1.70.01
tested with the kernel and several applications sorry for previous ugly commit git-svn-id: svn://kolibrios.org@2665 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
96a29bfdda
commit
73798864bd
@ -1,281 +1,265 @@
|
||||
|
||||
Visit http://flatassembler.net/ for more information.
|
||||
|
||||
|
||||
version 1.69.11 (Dec 19, 2009)
|
||||
|
||||
[+] Allowed syntax of "pmovmskb" with 64-bit register destination in long mode.
|
||||
|
||||
[-] The code generated for "call eax" instruction was missing prefix in 16-bit
|
||||
mode - fixed.
|
||||
|
||||
|
||||
version 1.69.10 (Oct 28, 2009)
|
||||
|
||||
[-] Fixed long mode opcode generator to allow absolute addresses to be
|
||||
generated with "qword" keyword inside square brackets.
|
||||
|
||||
|
||||
version 1.69.09 (Oct 20, 2009)
|
||||
|
||||
[-] Fixed a crash during the symbolic information generation when a "static"
|
||||
symbol was encountered.
|
||||
|
||||
|
||||
version 1.69.08 (Oct 04, 2009)
|
||||
|
||||
[-] Minor bugfixes.
|
||||
|
||||
|
||||
version 1.69.07 (Oct 03, 2009)
|
||||
|
||||
[-] Corrected encoding of "extrq" intruction for some cases.
|
||||
|
||||
|
||||
version 1.69.06 (Sep 29, 2009)
|
||||
|
||||
[-] The prefix 67h for "jecxz" and "loopd" instructions in 64-bit mode wasn't
|
||||
correctly generated - fixed.
|
||||
|
||||
[-] It's no longer possible to define two special segments of the same type
|
||||
in ELF executables.
|
||||
|
||||
|
||||
version 1.69.05 (Sep 14, 2009)
|
||||
|
||||
[+] Allowed to specify branding value (use 3 for Linux) after the
|
||||
"format ELF executable" setting.
|
||||
|
||||
[+] Added "intepreter", "dynamic" and "note" keywords for creation of
|
||||
special segments in ELF executables.
|
||||
|
||||
|
||||
version 1.69.04 (Sep 7, 2009)
|
||||
|
||||
[-] Fixed a bug with REX prefix generation with address of type "rX+rsp".
|
||||
|
||||
|
||||
version 1.69.03 (Aug 03, 2009)
|
||||
|
||||
[+] Allowed simplified syntax for "monitor", "mwait", "blendvps", "blendvpd" and
|
||||
"pblendvb" instructions.
|
||||
|
||||
|
||||
version 1.69.02 (Jul 04, 2009)
|
||||
|
||||
[-] Minor bugfixes.
|
||||
|
||||
|
||||
version 1.69.01 (Jul 01, 2009)
|
||||
|
||||
[+] Added "movbe" instruction.
|
||||
|
||||
[-] "extractps" no longer generates the double 66h prefix.
|
||||
|
||||
|
||||
version 1.69.00 (Jun 23, 2009)
|
||||
|
||||
[+] Extended the syntax of "rept" directive to allow numerical expressions
|
||||
to be calculated by preprocessor in its arguments.
|
||||
|
||||
[-] The code of assembler (but not data) has been made position-independent, and
|
||||
this allowed to use code segmentation in DOS unREAL mode, so the code is
|
||||
no longer limited to 64 kilobytes.
|
||||
|
||||
|
||||
version 1.68 (Jun 13, 2009)
|
||||
|
||||
[+] Added SSSE3 (Supplemental SSE3), SSE4.1, SSE4.2 and SSE4a instructions.
|
||||
|
||||
[+] Added the AMD SVM and Intel SMX instructions.
|
||||
|
||||
[+] Added "rdmsrq", "wrmsrq", "sysexitq" and "sysretq" mnemonics for the
|
||||
64-bit variants of respective instructions.
|
||||
|
||||
[+] Added "fstenvw", "fstenvd", "fsavew", "fsaved", "frstorw" and "frstord"
|
||||
mnemonics to allow choosing between 16-bit and 32-bit variants of
|
||||
structures used by the "fstenv", "fsave" and "frstor" instructions.
|
||||
|
||||
[+] Added "plt" operator for the ELF output format.
|
||||
|
||||
[+] Allowed "rva" operator to be used in MS COFF object format, and also
|
||||
added "static" keyword for the "public" directive.
|
||||
|
||||
[+] Added Intel-style aliases for the additional long mode 8-bit registers.
|
||||
|
||||
[-] The PE formatter now automatically detects whether relocatable labels
|
||||
should be used, depending on whether the fixups directory is placed
|
||||
somewhere into executable by programer, or not. This makes possible the
|
||||
more flexible use of the addressing symbols in case of PE executable fixed
|
||||
at some position.
|
||||
|
||||
[-] Added support for outputting the 32-bit address relocations in case of
|
||||
64-bit object formats and PE executable. This makes some specific
|
||||
instructions compilable, but it also forces linker to put such
|
||||
generated code into the low 2 gigabytes of addressing space.
|
||||
|
||||
[+] Added "EFI", "EFIboot" and "EFIruntime" subsystem keywords for PE format.
|
||||
|
||||
[-] Corrected the precedence of operators of macroinstruction line maker.
|
||||
The symbol escaping now has always the higher priority than symbol conversion,
|
||||
and both have higher precedence than concatenation.
|
||||
|
||||
[+] Allowed to check "@b" and "@f" symbols with "defined" operator.
|
||||
|
||||
[+] Allowed "as" operator to specify the output file extension when
|
||||
placed at the end of the "format" directive line.
|
||||
|
||||
[-] Definition of macro with the same name as one of the preprocessor's directives
|
||||
is no longer allowed.
|
||||
|
||||
[+] Allowed single quote character to be put inside the number value,
|
||||
to help improve long numbers readability.
|
||||
|
||||
[+] Added optional symbolic information output, and a set of tools that extract
|
||||
various kinds of information from it.
|
||||
|
||||
[+] Added "err" directive that allows to signalize error from the source.
|
||||
|
||||
|
||||
version 1.66 (May 7, 2006)
|
||||
|
||||
[+] Added "define" directive to preprocessor, which defines symbolic constants,
|
||||
the same kind as "equ" directive, however there's an important difference
|
||||
that "define" doesn't process symbolic constants in the value before
|
||||
assigning it. For example:
|
||||
|
||||
a equ 1
|
||||
a equ a+a
|
||||
|
||||
define b 1
|
||||
define b b+b
|
||||
|
||||
defines the "a" constant with value "1+1", but the "b" is defined with
|
||||
value "b+b". This directive may be useful in some advanced
|
||||
macroinstructions.
|
||||
|
||||
[-] Moved part of the conditional expression processing into parser,
|
||||
for slightly better performance and lesser memory usage by assembler.
|
||||
The logical values defined with "eq", "eqtype" and "in" operators are now
|
||||
evaluated by the parser and if they are enough to determine the condition,
|
||||
the whole block is processed accordingly. Thus this block:
|
||||
|
||||
if eax eq EAX | 0/0
|
||||
nop
|
||||
end if
|
||||
|
||||
is parsed into just "nop" instruction, since parser is able to determine
|
||||
that the condition is true, even though one of the logical values makes no
|
||||
sense - but since this is none of the "eq", "eqtype" and "in" expressions,
|
||||
the parser doesn't investigate.
|
||||
|
||||
[-] Also the assembler is now calculating only as many logical values as it
|
||||
needs to determine the condition. So this block:
|
||||
|
||||
if defined alpha & alpha
|
||||
|
||||
end if
|
||||
|
||||
will not cause error when "alpha" is not defined, as it would with previous
|
||||
versions. This is because after checking that "defined alpha" is false
|
||||
condition it doesn't need to know the second logical value to determine the
|
||||
value of conjunction.
|
||||
|
||||
[+] Added "short" keyword for specifying jump type, the "jmp byte" form is now
|
||||
obsolete and no longer correct - use "jmp short" instead.
|
||||
|
||||
[-] The size operator applied to jump no longer applies to the size of relative
|
||||
displacement - now it applies to the size of target address.
|
||||
|
||||
[-] The "ret" instruction with 0 parameter is now assembled into short form,
|
||||
unless you force using the 16-bit immediate with "word" operator.
|
||||
|
||||
[+] Added missing extended registers for the 32-bit addressing in long mode.
|
||||
|
||||
[+] Added "linkremove" and "linkinfo" section flags for MS COFF output.
|
||||
|
||||
[+] Added support for GOT offsets in ELF object formatter, which can be useful
|
||||
when making position-independent code for shared libraries. For any label
|
||||
you can get its offset relative to GOT by preceding it with "rva" operator
|
||||
(the same keyword as for PE format is used, to avoid adding a new one,
|
||||
while this one has very similar meaning).
|
||||
|
||||
[-] Changed ELF executable to use "segment" directive in place of "section",
|
||||
to make the distinction between the run-time segments and linkable
|
||||
sections. If you had a "section" directive in your ELF executables and they
|
||||
no longer assemble, replace it with "segment".
|
||||
|
||||
[-] The PE formatter now always creates the fixups directory when told to -
|
||||
even when there are no fixups to be put there (in such case it creates the
|
||||
directory with one empty block).
|
||||
|
||||
[-] Some of the internal structures have been extended to provide the
|
||||
possibility of making extensive symbol dumps.
|
||||
|
||||
[-] Corrected "fix" directive to keep the value intact before assigning it to the
|
||||
prioritized constant.
|
||||
|
||||
[+] The ` operator now works with any kind of symbol; when used with quoted
|
||||
string it simply does nothing. Thus the sequence of ` operators applied to
|
||||
one symbol work the same as if there was just one. In similar manner, the
|
||||
sequence of # operators now works as if it was a single one - using such a
|
||||
sequence instead of escaping, which was kept for some backward
|
||||
compatibility, is now deprecated.
|
||||
|
||||
[-] Corrected order of identifying assembler directives ("if db eq db" was
|
||||
incorrectly interpreted as data definition).
|
||||
|
||||
[-] Many other small bugs fixed.
|
||||
|
||||
|
||||
version 1.64 (Aug 8, 2005)
|
||||
|
||||
[+] Output of PE executables for Win64 architecture (with "format PE64"
|
||||
setting).
|
||||
|
||||
[+] Added "while" and "break" directives.
|
||||
|
||||
[+] Added "irp" and "irps" directives.
|
||||
|
||||
[+] The macro arguments can be marked as required with the "*" character.
|
||||
|
||||
[-] Fixed checking for overflow when multiplying 64-bit values - the result
|
||||
must always fit in the range of signed 64 integer now.
|
||||
|
||||
[-] Segment prefixes were generated incorrectly in 16-bit mode when BP was used
|
||||
as a second addressing register - fixed.
|
||||
|
||||
[-] The "local" directive was not creating unique labels in some cases - fixed.
|
||||
|
||||
[-] The "not encodable with long immediate" error in 64-bit mode was sometimes
|
||||
wrongly signaled - fixed.
|
||||
|
||||
[-] Other minor fixes and corrections.
|
||||
|
||||
|
||||
version 1.62 (Jun 14, 2005)
|
||||
|
||||
[+] Escaping of symbols inside macroinstructions with backslash.
|
||||
|
||||
[+] Ability of outputting the COFF object files for Win64 architecture
|
||||
(with "format MS64 COFF" setting).
|
||||
|
||||
[+] New preprocessor directives: "restruc", "rept" and "match"
|
||||
|
||||
[+] VMX instructions support (not documented).
|
||||
|
||||
[+] Extended data directives to allow use of the "dup" operator.
|
||||
|
||||
[+] Extended "struc" features to allow custom definitions of main structure's
|
||||
label.
|
||||
|
||||
[-] When building resources from the the .RES file that contained more
|
||||
than one resource of the same string name, the separate resource
|
||||
directories were created with the same names - fixed.
|
||||
|
||||
[-] Several bugs in the ELF64 object output has been fixed.
|
||||
|
||||
[-] Corrected behavior of "fix" directive to more straightforward.
|
||||
|
||||
[-] Fixed bug in "include" directive, which caused files included from within
|
||||
macros to be processed the wrong way.
|
||||
|
||||
Visit http://flatassembler.net/ for more information.
|
||||
|
||||
|
||||
version 1.70.01 (Apr 30, 2012)
|
||||
|
||||
[-] Corrected a recently introduced bug that caused some incorrect
|
||||
address expressions to cause an error prematurely during the
|
||||
parsing stage.
|
||||
|
||||
|
||||
version 1.70 (Apr 17, 2012)
|
||||
|
||||
[+] Added support for AVX, AVX2, AES, CLMUL, FMA, RDRAND, FSGSBASE, F16C,
|
||||
FMA4, XOP, MOVBE, BMI, TBM, INVPCID, HLE and RTM instruction sets.
|
||||
|
||||
[+] Added half-precision floating point values support.
|
||||
|
||||
[+] Extended the syntax of "rept" directive to allow numerical expressions
|
||||
to be calculated by preprocessor in its arguments.
|
||||
|
||||
[+] Added "large" and "NX" settings from PE format.
|
||||
|
||||
[+] Allowed PE fixups to be resolved anywhere in the generated executable.
|
||||
|
||||
[+] Allowed to specify branding value (use 3 for Linux) after the
|
||||
"format ELF executable" setting.
|
||||
|
||||
[+] Added "intepreter", "dynamic" and "note" keywords for creation of
|
||||
special segments in ELF executables.
|
||||
|
||||
[-] Fixed long mode opcode generator to allow absolute addresses to be
|
||||
generated with "qword" keyword inside square brackets.
|
||||
|
||||
[-] Disallowed negative immediates with "int", "enter", "ret" instructions.
|
||||
|
||||
[+] Allowed symbolic information dump file to be created even in case of error.
|
||||
In such case it contains only the preprocessed source that can be extracted
|
||||
with PREPSRC tool. If error occured during preprocessing, only the source up
|
||||
to the point of error is provided.
|
||||
|
||||
[+] Added symbol references table to symbolic dump file.
|
||||
|
||||
[-] Corrected the "defined" and "used" flags in the symbols dump to reflect the
|
||||
state from the final assembly pass.
|
||||
|
||||
[+] Added "assert" directive.
|
||||
|
||||
[-] Formatter symbols like "PE" or "readable" are now recognized only in the
|
||||
context of formatter directives, and thus are no longer disallowed as
|
||||
labels.
|
||||
|
||||
[+] Macroinstruction argument now can have default value, defined with "="
|
||||
symbol followed by value after the argument name in definition.
|
||||
|
||||
[+] Added "relativeto" operator, which can be used in logical expressions
|
||||
to test whether two values differ only by a constant and not relocatable
|
||||
amount.
|
||||
|
||||
[-] Revised the expression calculator, it now is able to correctly perform
|
||||
calculations in signed and unsigned ranges in full 64-bit. This fixes
|
||||
a number of issues - the overflow will now be correctly detected for
|
||||
64-bit values in cases, where previous versions could not distinguish
|
||||
whether it was an overflow or not. The effect of these corrections is
|
||||
that "dq" directive will now behave consistently with behavior of the
|
||||
data directives for smaller sizes, and the same applies to all the
|
||||
places where "qword" size for value is used.
|
||||
|
||||
|
||||
version 1.68 (Jun 13, 2009)
|
||||
|
||||
[+] Added SSSE3 (Supplemental SSE3), SSE4.1, SSE4.2 and SSE4a instructions.
|
||||
|
||||
[+] Added the AMD SVM and Intel SMX instructions.
|
||||
|
||||
[+] Added "rdmsrq", "wrmsrq", "sysexitq" and "sysretq" mnemonics for the
|
||||
64-bit variants of respective instructions.
|
||||
|
||||
[+] Added "fstenvw", "fstenvd", "fsavew", "fsaved", "frstorw" and "frstord"
|
||||
mnemonics to allow choosing between 16-bit and 32-bit variants of
|
||||
structures used by the "fstenv", "fsave" and "frstor" instructions.
|
||||
|
||||
[+] Added "plt" operator for the ELF output format.
|
||||
|
||||
[+] Allowed "rva" operator to be used in MS COFF object format, and also
|
||||
added "static" keyword for the "public" directive.
|
||||
|
||||
[+] Added Intel-style aliases for the additional long mode 8-bit registers.
|
||||
|
||||
[-] The PE formatter now automatically detects whether relocatable labels
|
||||
should be used, depending on whether the fixups directory is placed
|
||||
somewhere into executable by programer, or not. This makes possible the
|
||||
more flexible use of the addressing symbols in case of PE executable fixed
|
||||
at some position.
|
||||
|
||||
[-] Added support for outputting the 32-bit address relocations in case of
|
||||
64-bit object formats and PE executable. This makes some specific
|
||||
instructions compilable, but it also forces linker to put such
|
||||
generated code into the low 2 gigabytes of addressing space.
|
||||
|
||||
[+] Added "EFI", "EFIboot" and "EFIruntime" subsystem keywords for PE format.
|
||||
|
||||
[-] Corrected the precedence of operators of macroinstruction line maker.
|
||||
The symbol escaping now has always the higher priority than symbol conversion,
|
||||
and both have higher precedence than concatenation.
|
||||
|
||||
[+] Allowed to check "@b" and "@f" symbols with "defined" operator.
|
||||
|
||||
[+] Allowed "as" operator to specify the output file extension when
|
||||
placed at the end of the "format" directive line.
|
||||
|
||||
[-] Definition of macro with the same name as one of the preprocessor's directives
|
||||
is no longer allowed.
|
||||
|
||||
[+] Allowed single quote character to be put inside the number value,
|
||||
to help improve long numbers readability.
|
||||
|
||||
[+] Added optional symbolic information output, and a set of tools that extract
|
||||
various kinds of information from it.
|
||||
|
||||
[+] Added "err" directive that allows to signalize error from the source.
|
||||
|
||||
|
||||
version 1.66 (May 7, 2006)
|
||||
|
||||
[+] Added "define" directive to preprocessor, which defines symbolic constants,
|
||||
the same kind as "equ" directive, however there's an important difference
|
||||
that "define" doesn't process symbolic constants in the value before
|
||||
assigning it. For example:
|
||||
|
||||
a equ 1
|
||||
a equ a+a
|
||||
|
||||
define b 1
|
||||
define b b+b
|
||||
|
||||
defines the "a" constant with value "1+1", but the "b" is defined with
|
||||
value "b+b". This directive may be useful in some advanced
|
||||
macroinstructions.
|
||||
|
||||
[-] Moved part of the conditional expression processing into parser,
|
||||
for slightly better performance and lesser memory usage by assembler.
|
||||
The logical values defined with "eq", "eqtype" and "in" operators are now
|
||||
evaluated by the parser and if they are enough to determine the condition,
|
||||
the whole block is processed accordingly. Thus this block:
|
||||
|
||||
if eax eq EAX | 0/0
|
||||
nop
|
||||
end if
|
||||
|
||||
is parsed into just "nop" instruction, since parser is able to determine
|
||||
that the condition is true, even though one of the logical values makes no
|
||||
sense - but since this is none of the "eq", "eqtype" and "in" expressions,
|
||||
the parser doesn't investigate.
|
||||
|
||||
[-] Also the assembler is now calculating only as many logical values as it
|
||||
needs to determine the condition. So this block:
|
||||
|
||||
if defined alpha & alpha
|
||||
|
||||
end if
|
||||
|
||||
will not cause error when "alpha" is not defined, as it would with previous
|
||||
versions. This is because after checking that "defined alpha" is false
|
||||
condition it doesn't need to know the second logical value to determine the
|
||||
value of conjunction.
|
||||
|
||||
[+] Added "short" keyword for specifying jump type, the "jmp byte" form is now
|
||||
obsolete and no longer correct - use "jmp short" instead.
|
||||
|
||||
[-] The size operator applied to jump no longer applies to the size of relative
|
||||
displacement - now it applies to the size of target address.
|
||||
|
||||
[-] The "ret" instruction with 0 parameter is now assembled into short form,
|
||||
unless you force using the 16-bit immediate with "word" operator.
|
||||
|
||||
[+] Added missing extended registers for the 32-bit addressing in long mode.
|
||||
|
||||
[+] Added "linkremove" and "linkinfo" section flags for MS COFF output.
|
||||
|
||||
[+] Added support for GOT offsets in ELF object formatter, which can be useful
|
||||
when making position-independent code for shared libraries. For any label
|
||||
you can get its offset relative to GOT by preceding it with "rva" operator
|
||||
(the same keyword as for PE format is used, to avoid adding a new one,
|
||||
while this one has very similar meaning).
|
||||
|
||||
[-] Changed ELF executable to use "segment" directive in place of "section",
|
||||
to make the distinction between the run-time segments and linkable
|
||||
sections. If you had a "section" directive in your ELF executables and they
|
||||
no longer assemble, replace it with "segment".
|
||||
|
||||
[-] The PE formatter now always creates the fixups directory when told to -
|
||||
even when there are no fixups to be put there (in such case it creates the
|
||||
directory with one empty block).
|
||||
|
||||
[-] Some of the internal structures have been extended to provide the
|
||||
possibility of making extensive symbol dumps.
|
||||
|
||||
[-] Corrected "fix" directive to keep the value intact before assigning it to the
|
||||
prioritized constant.
|
||||
|
||||
[+] The ` operator now works with any kind of symbol; when used with quoted
|
||||
string it simply does nothing. Thus the sequence of ` operators applied to
|
||||
one symbol work the same as if there was just one. In similar manner, the
|
||||
sequence of # operators now works as if it was a single one - using such a
|
||||
sequence instead of escaping, which was kept for some backward
|
||||
compatibility, is now deprecated.
|
||||
|
||||
[-] Corrected order of identifying assembler directives ("if db eq db" was
|
||||
incorrectly interpreted as data definition).
|
||||
|
||||
[-] Many other small bugs fixed.
|
||||
|
||||
|
||||
version 1.64 (Aug 8, 2005)
|
||||
|
||||
[+] Output of PE executables for Win64 architecture (with "format PE64"
|
||||
setting).
|
||||
|
||||
[+] Added "while" and "break" directives.
|
||||
|
||||
[+] Added "irp" and "irps" directives.
|
||||
|
||||
[+] The macro arguments can be marked as required with the "*" character.
|
||||
|
||||
[-] Fixed checking for overflow when multiplying 64-bit values - the result
|
||||
must always fit in the range of signed 64 integer now.
|
||||
|
||||
[-] Segment prefixes were generated incorrectly in 16-bit mode when BP was used
|
||||
as a second addressing register - fixed.
|
||||
|
||||
[-] The "local" directive was not creating unique labels in some cases - fixed.
|
||||
|
||||
[-] The "not encodable with long immediate" error in 64-bit mode was sometimes
|
||||
wrongly signaled - fixed.
|
||||
|
||||
[-] Other minor fixes and corrections.
|
||||
|
||||
|
||||
version 1.62 (Jun 14, 2005)
|
||||
|
||||
[+] Escaping of symbols inside macroinstructions with backslash.
|
||||
|
||||
[+] Ability of outputting the COFF object files for Win64 architecture
|
||||
(with "format MS64 COFF" setting).
|
||||
|
||||
[+] New preprocessor directives: "restruc", "rept" and "match"
|
||||
|
||||
[+] VMX instructions support (not documented).
|
||||
|
||||
[+] Extended data directives to allow use of the "dup" operator.
|
||||
|
||||
[+] Extended "struc" features to allow custom definitions of main structure's
|
||||
label.
|
||||
|
||||
[-] When building resources from the the .RES file that contained more
|
||||
than one resource of the same string name, the separate resource
|
||||
directories were created with the same names - fixed.
|
||||
|
||||
[-] Several bugs in the ELF64 object output has been fixed.
|
||||
|
||||
[-] Corrected behavior of "fix" directive to more straightforward.
|
||||
|
||||
[-] Fixed bug in "include" directive, which caused files included from within
|
||||
macros to be processed the wrong way.
|
||||
|
@ -35,6 +35,8 @@ assembler:
|
||||
mov [file_extension],eax
|
||||
mov [next_pass_needed],al
|
||||
mov [output_format],al
|
||||
mov [org_origin_sign],al
|
||||
mov [adjustment_sign],al
|
||||
mov [labels_type],al
|
||||
mov [virtual_data],al
|
||||
mov [code_type],16
|
||||
@ -169,6 +171,8 @@ assemble_line:
|
||||
mov [prefixed_instruction],0
|
||||
cmp [symbols_file],0
|
||||
je continue_line
|
||||
cmp [next_pass_needed],0
|
||||
jne continue_line
|
||||
mov ebx,[display_buffer]
|
||||
mov dword [ebx-4],1
|
||||
mov dword [ebx-8],1Ch
|
||||
@ -185,6 +189,11 @@ assemble_line:
|
||||
mov [ebx+8+4],edx
|
||||
mov [ebx+10h],ecx
|
||||
mov edx,[org_symbol]
|
||||
; mov al,[virtual_data]
|
||||
; mov ah,[org_origin_sign]
|
||||
; shl eax,16
|
||||
; mov al,[labels_type]
|
||||
; mov ah,[code_type]
|
||||
mov eax,dword [labels_type]
|
||||
mov [ebx+14h],edx
|
||||
mov [ebx+18h],eax
|
||||
@ -199,24 +208,39 @@ assemble_line:
|
||||
je reserved_word_used_as_symbol
|
||||
mov ebx,eax
|
||||
lods byte [esi]
|
||||
mov cl,al
|
||||
mov [label_size],al
|
||||
call make_label
|
||||
jmp continue_line
|
||||
make_label:
|
||||
mov eax,edi
|
||||
xor edx,edx
|
||||
xor cl,cl
|
||||
sub eax,dword [org_origin]
|
||||
sbb edx,dword [org_origin+4]
|
||||
mov ch,[labels_type]
|
||||
sbb cl,[org_origin_sign]
|
||||
jp label_value_ok
|
||||
call recoverable_overflow
|
||||
label_value_ok:
|
||||
mov [address_sign],cl
|
||||
cmp [virtual_data],0
|
||||
jne make_virtual_label
|
||||
or byte [ebx+9],1
|
||||
xchg eax,[ebx]
|
||||
xchg edx,[ebx+4]
|
||||
mov ch,[ebx+9]
|
||||
shr ch,1
|
||||
and ch,1
|
||||
neg ch
|
||||
sub eax,[ebx]
|
||||
sbb edx,[ebx+4]
|
||||
sbb ch,cl
|
||||
mov dword [adjustment],eax
|
||||
mov dword [adjustment+4],edx
|
||||
mov [adjustment_sign],ch
|
||||
or al,ch
|
||||
or eax,edx
|
||||
setnz ah
|
||||
jmp finish_label_symbol
|
||||
jmp finish_label
|
||||
make_virtual_label:
|
||||
and byte [ebx+9],not 1
|
||||
cmp eax,[ebx]
|
||||
@ -226,7 +250,17 @@ assemble_line:
|
||||
mov [ebx+4],edx
|
||||
setne al
|
||||
or ah,al
|
||||
finish_label:
|
||||
mov ch,[labels_type]
|
||||
mov cl,[label_size]
|
||||
mov ebp,[org_registers]
|
||||
mov edx,[org_symbol]
|
||||
finish_label_symbol:
|
||||
mov al,[address_sign]
|
||||
xor al,[ebx+9]
|
||||
and al,10b
|
||||
or ah,al
|
||||
xor [ebx+9],al
|
||||
cmp cl,[ebx+10]
|
||||
mov [ebx+10],cl
|
||||
setne al
|
||||
@ -235,14 +269,12 @@ assemble_line:
|
||||
mov [ebx+11],ch
|
||||
setne al
|
||||
or ah,al
|
||||
mov edx,[org_registers]
|
||||
cmp edx,[ebx+12]
|
||||
mov [ebx+12],edx
|
||||
cmp ebp,[ebx+12]
|
||||
mov [ebx+12],ebp
|
||||
setne al
|
||||
or ah,al
|
||||
or ch,ch
|
||||
jz label_symbol_ok
|
||||
mov edx,[org_symbol]
|
||||
cmp edx,[ebx+20]
|
||||
mov [ebx+20],edx
|
||||
setne al
|
||||
@ -261,17 +293,18 @@ assemble_line:
|
||||
sub cx,[ebx+16]
|
||||
setnz al
|
||||
or ah,al
|
||||
jz continue_line
|
||||
jz label_made
|
||||
test byte [ebx+8],8
|
||||
jz continue_line
|
||||
jz label_made
|
||||
mov cx,[current_pass]
|
||||
cmp cx,[ebx+18]
|
||||
jne continue_line
|
||||
jne label_made
|
||||
or [next_pass_needed],-1
|
||||
jmp continue_line
|
||||
label_made:
|
||||
ret
|
||||
new_label:
|
||||
or byte [ebx+8],1
|
||||
jmp continue_line
|
||||
ret
|
||||
define_constant:
|
||||
lods dword [esi]
|
||||
inc esi
|
||||
@ -293,6 +326,7 @@ assemble_line:
|
||||
push eax
|
||||
mov al,byte [esi-1]
|
||||
push eax
|
||||
or [size_override],-1
|
||||
call get_value
|
||||
pop ebx
|
||||
mov ch,bl
|
||||
@ -314,6 +348,11 @@ assemble_line:
|
||||
mov [ebx+4],edx
|
||||
setne al
|
||||
or ah,al
|
||||
mov al,[value_sign]
|
||||
xor al,[ebx+9]
|
||||
and al,10b
|
||||
or ah,al
|
||||
xor [ebx+9],al
|
||||
cmp cl,[ebx+10]
|
||||
mov [ebx+10],cl
|
||||
setne al
|
||||
@ -370,12 +409,12 @@ assemble_line:
|
||||
; mov [size_override],0
|
||||
; mov [operand_prefix],0
|
||||
; mov [opcode_prefix],0
|
||||
mov dword [operand_size],0
|
||||
and dword [operand_size],0
|
||||
; mov [rex_prefix],0
|
||||
; mov [vex_required],0
|
||||
; mov [vex_register],0
|
||||
; mov [immediate_size],0
|
||||
mov dword [rex_prefix],0
|
||||
and dword [rex_prefix],0
|
||||
call instruction_handler
|
||||
instruction_handler:
|
||||
movzx ebx,word [esi]
|
||||
@ -408,13 +447,18 @@ org_directive:
|
||||
test cl,1
|
||||
jnz invalid_use_of_symbol
|
||||
mov [labels_type],cl
|
||||
mov ecx,edi
|
||||
sub ecx,eax
|
||||
adc edx,0
|
||||
neg edx
|
||||
mov dword [org_origin],ecx
|
||||
mov dword [org_origin+4],edx
|
||||
mov [org_registers],0
|
||||
mov dword [org_origin],edi
|
||||
xor ecx,ecx
|
||||
mov dword [org_origin+4],ecx
|
||||
mov [org_origin_sign],cl
|
||||
mov [org_registers],ecx
|
||||
mov cl,[value_sign]
|
||||
sub dword [org_origin],eax
|
||||
sbb dword [org_origin+4],edx
|
||||
sbb [org_origin_sign],cl
|
||||
jp org_value_ok
|
||||
call recoverable_overflow
|
||||
org_value_ok:
|
||||
mov [org_start],edi
|
||||
mov edx,[symbol_identifier]
|
||||
mov [org_symbol],edx
|
||||
@ -436,7 +480,7 @@ label_directive:
|
||||
je reserved_word_used_as_symbol
|
||||
inc esi
|
||||
mov ebx,eax
|
||||
xor cl,cl
|
||||
mov [label_size],0
|
||||
lods byte [esi]
|
||||
cmp al,':'
|
||||
je get_label_size
|
||||
@ -447,30 +491,12 @@ label_directive:
|
||||
lods word [esi]
|
||||
cmp al,11h
|
||||
jne invalid_argument
|
||||
mov cl,ah
|
||||
mov [label_size],ah
|
||||
label_size_ok:
|
||||
mov eax,edi
|
||||
xor edx,edx
|
||||
sub eax,dword [org_origin]
|
||||
sbb edx,dword [org_origin+4]
|
||||
mov ebp,[org_registers]
|
||||
cmp byte [esi],80h
|
||||
je get_free_label_value
|
||||
mov ch,[labels_type]
|
||||
push [org_symbol]
|
||||
pop [address_symbol]
|
||||
cmp [virtual_data],0
|
||||
jne make_free_label
|
||||
or byte [ebx+9],1
|
||||
xchg eax,[ebx]
|
||||
xchg edx,[ebx+4]
|
||||
sub eax,[ebx]
|
||||
sbb edx,[ebx+4]
|
||||
mov dword [adjustment],eax
|
||||
mov dword [adjustment+4],edx
|
||||
or eax,edx
|
||||
setne ah
|
||||
jmp finish_label
|
||||
call make_label
|
||||
jmp instruction_assembled
|
||||
get_free_label_value:
|
||||
inc esi
|
||||
lods byte [esi]
|
||||
@ -507,50 +533,9 @@ label_directive:
|
||||
mov [ebx+4],edx
|
||||
setne al
|
||||
or ah,al
|
||||
finish_label:
|
||||
cmp cl,[ebx+10]
|
||||
mov [ebx+10],cl
|
||||
setne al
|
||||
or ah,al
|
||||
cmp ch,[ebx+11]
|
||||
mov [ebx+11],ch
|
||||
setne al
|
||||
or ah,al
|
||||
cmp ebp,[ebx+12]
|
||||
mov [ebx+12],ebp
|
||||
setne al
|
||||
or ah,al
|
||||
or ch,ch
|
||||
jz free_label_symbol_ok
|
||||
mov edx,[address_symbol]
|
||||
cmp edx,[ebx+20]
|
||||
mov [ebx+20],edx
|
||||
setne al
|
||||
or ah,al
|
||||
free_label_symbol_ok:
|
||||
mov cx,[current_pass]
|
||||
xchg [ebx+16],cx
|
||||
mov edx,[current_line]
|
||||
mov [ebx+28],edx
|
||||
and byte [ebx+8],not 2
|
||||
test byte [ebx+8],1
|
||||
jz new_free_label
|
||||
cmp cx,[ebx+16]
|
||||
je symbol_already_defined
|
||||
inc cx
|
||||
sub cx,[ebx+16]
|
||||
setnz al
|
||||
or ah,al
|
||||
jz instruction_assembled
|
||||
test byte [ebx+8],8
|
||||
jz instruction_assembled
|
||||
mov cx,[current_pass]
|
||||
cmp cx,[ebx+18]
|
||||
jne instruction_assembled
|
||||
or [next_pass_needed],-1
|
||||
jmp instruction_assembled
|
||||
new_free_label:
|
||||
or byte [ebx+8],1
|
||||
mov cl,[label_size]
|
||||
call finish_label_symbol
|
||||
jmp instruction_assembled
|
||||
load_directive:
|
||||
lods byte [esi]
|
||||
@ -571,8 +556,8 @@ load_directive:
|
||||
cmp al,8
|
||||
ja invalid_value
|
||||
mov [operand_size],al
|
||||
mov dword [value],0
|
||||
mov dword [value+4],0
|
||||
and dword [value],0
|
||||
and dword [value+4],0
|
||||
lods word [esi]
|
||||
cmp ax,82h+'(' shl 8
|
||||
jne invalid_argument
|
||||
@ -603,13 +588,10 @@ load_directive:
|
||||
rep movs byte [edi],[esi]
|
||||
jmp value_loaded
|
||||
bad_load_address:
|
||||
cmp [error_line],0
|
||||
jne value_loaded
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],value_out_of_range
|
||||
call recoverable_overflow
|
||||
value_loaded:
|
||||
pop edi esi
|
||||
mov [value_sign],0
|
||||
mov eax,dword [value]
|
||||
mov edx,dword [value+4]
|
||||
pop ebx
|
||||
@ -627,6 +609,7 @@ store_directive:
|
||||
mov [operand_size],1
|
||||
jmp store_value_ok
|
||||
sized_store:
|
||||
or [size_override],-1
|
||||
call get_value
|
||||
store_value_ok:
|
||||
cmp [value_type],0
|
||||
@ -669,11 +652,7 @@ store_directive:
|
||||
jmp instruction_assembled
|
||||
bad_store_address:
|
||||
pop edi esi
|
||||
cmp [error_line],0
|
||||
jne instruction_assembled
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],value_out_of_range
|
||||
call recoverable_overflow
|
||||
jmp instruction_assembled
|
||||
|
||||
display_directive:
|
||||
@ -795,10 +774,8 @@ virtual_directive:
|
||||
je invalid_value
|
||||
call get_address_value
|
||||
mov ebp,[address_symbol]
|
||||
xor ch,ch
|
||||
or bh,bh
|
||||
jz set_virtual
|
||||
mov ch,1
|
||||
setnz ch
|
||||
jmp set_virtual
|
||||
virtual_at_current:
|
||||
dec esi
|
||||
@ -807,8 +784,11 @@ virtual_directive:
|
||||
mov ebp,[org_symbol]
|
||||
mov eax,edi
|
||||
xor edx,edx
|
||||
xor cl,cl
|
||||
sub eax,dword [org_origin]
|
||||
sbb edx,dword [org_origin+4]
|
||||
sbb cl,[org_origin_sign]
|
||||
mov [address_sign],cl
|
||||
mov bx,word [org_registers]
|
||||
mov cx,word [org_registers+2]
|
||||
xchg bh,bl
|
||||
@ -821,19 +801,27 @@ virtual_directive:
|
||||
mov byte [org_registers+3],cl
|
||||
call allocate_structure_data
|
||||
mov word [ebx],virtual_directive-instruction_handler
|
||||
mov cl,[address_sign]
|
||||
not eax
|
||||
not edx
|
||||
not cl
|
||||
add eax,1
|
||||
adc edx,0
|
||||
adc cl,0
|
||||
add eax,edi
|
||||
adc edx,0
|
||||
adc cl,0
|
||||
xchg dword [org_origin],eax
|
||||
xchg dword [org_origin+4],edx
|
||||
xchg [org_origin_sign],cl
|
||||
mov [ebx+10h],eax
|
||||
mov [ebx+14h],edx
|
||||
pop eax
|
||||
mov [ebx+18h],eax
|
||||
mov al,[virtual_data]
|
||||
and al,0Fh
|
||||
shl cl,4
|
||||
or al,cl
|
||||
mov [ebx+2],al
|
||||
mov al,[labels_type]
|
||||
mov [ebx+3],al
|
||||
@ -876,7 +864,14 @@ virtual_directive:
|
||||
call find_structure_data
|
||||
jc unexpected_instruction
|
||||
mov al,[ebx+2]
|
||||
mov ah,al
|
||||
shr ah,4
|
||||
and al,1
|
||||
neg al
|
||||
and ah,1
|
||||
neg ah
|
||||
mov [virtual_data],al
|
||||
mov [org_origin_sign],ah
|
||||
mov al,[ebx+3]
|
||||
mov [labels_type],al
|
||||
mov eax,[ebx+10h]
|
||||
@ -1339,7 +1334,7 @@ data_words:
|
||||
cmp al,'?'
|
||||
jne invalid_argument
|
||||
mov eax,edi
|
||||
mov word [edi],0
|
||||
and word [edi],0
|
||||
scas word [edi]
|
||||
jmp undefined_data
|
||||
ret
|
||||
@ -1377,7 +1372,7 @@ data_dwords:
|
||||
cmp al,'?'
|
||||
jne invalid_argument
|
||||
mov eax,edi
|
||||
mov dword [edi],0
|
||||
and dword [edi],0
|
||||
scas dword [edi]
|
||||
jmp undefined_data
|
||||
get_dword:
|
||||
@ -1420,9 +1415,9 @@ data_pwords:
|
||||
cmp al,'?'
|
||||
jne invalid_argument
|
||||
mov eax,edi
|
||||
mov dword [edi],0
|
||||
and dword [edi],0
|
||||
scas dword [edi]
|
||||
mov word [edi],0
|
||||
and word [edi],0
|
||||
scas word [edi]
|
||||
jmp undefined_data
|
||||
get_pword:
|
||||
@ -1467,9 +1462,9 @@ data_qwords:
|
||||
cmp al,'?'
|
||||
jne invalid_argument
|
||||
mov eax,edi
|
||||
mov dword [edi],0
|
||||
and dword [edi],0
|
||||
scas dword [edi]
|
||||
mov dword [edi],0
|
||||
and dword [edi],0
|
||||
scas dword [edi]
|
||||
jmp undefined_data
|
||||
get_qword:
|
||||
@ -1487,11 +1482,11 @@ data_twords:
|
||||
cmp al,'?'
|
||||
jne invalid_argument
|
||||
mov eax,edi
|
||||
mov dword [edi],0
|
||||
and dword [edi],0
|
||||
scas dword [edi]
|
||||
mov dword [edi],0
|
||||
and dword [edi],0
|
||||
scas dword [edi]
|
||||
mov word [edi],0
|
||||
and word [edi],0
|
||||
scas word [edi]
|
||||
jmp undefined_data
|
||||
get_tword:
|
||||
@ -1647,7 +1642,7 @@ data_file:
|
||||
mov esi,[eax]
|
||||
test byte [eax+7],80h
|
||||
jz get_current_path
|
||||
mov eax,[eax+12]
|
||||
mov eax,[eax+8]
|
||||
jmp find_current_source_path
|
||||
get_current_path:
|
||||
lodsb
|
||||
@ -1665,15 +1660,31 @@ data_file:
|
||||
jmp cut_current_path
|
||||
current_path_ok:
|
||||
mov esi,[esp+4]
|
||||
call preprocess_path
|
||||
call expand_path
|
||||
pop edx
|
||||
mov esi,edx
|
||||
call open
|
||||
jnc file_opened
|
||||
mov edx,[include_paths]
|
||||
search_in_include_paths:
|
||||
push edx esi
|
||||
mov edi,esi
|
||||
mov esi,[esp+4]
|
||||
call get_include_directory
|
||||
mov [esp+4],esi
|
||||
mov esi,[esp+8]
|
||||
call expand_path
|
||||
pop edx
|
||||
mov esi,edx
|
||||
call open
|
||||
pop edx
|
||||
jnc file_opened
|
||||
cmp byte [edx],0
|
||||
jne search_in_include_paths
|
||||
mov edi,esi
|
||||
mov esi,[esp]
|
||||
push edi
|
||||
call preprocess_path
|
||||
call expand_path
|
||||
pop edx
|
||||
mov esi,edx
|
||||
call open
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -72,8 +72,8 @@ invalid_address_size:
|
||||
address_sizes_do_not_agree:
|
||||
push _address_sizes_do_not_agree
|
||||
jmp error_with_source
|
||||
prefix_conflict:
|
||||
push _prefix_conflict
|
||||
disallowed_combination_of_registers:
|
||||
push _disallowed_combination_of_registers
|
||||
jmp error_with_source
|
||||
long_immediate_not_encodable:
|
||||
push _long_immediate_not_encodable
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,9 +1,9 @@
|
||||
|
||||
; flat assembler core
|
||||
; Copyright (c) 1999-2012, Tomasz Grysztar.
|
||||
; All rights reserved.
|
||||
|
||||
convert_expression:
|
||||
|
||||
; flat assembler core
|
||||
; Copyright (c) 1999-2012, Tomasz Grysztar.
|
||||
; All rights reserved.
|
||||
|
||||
convert_expression:
|
||||
push ebp
|
||||
call get_fp_value
|
||||
jnc fp_expression
|
||||
@ -12,14 +12,14 @@ convert_expression:
|
||||
push edi
|
||||
mov edi,single_operand_operators
|
||||
call get_operator
|
||||
pop edi
|
||||
or al,al
|
||||
jz expression_element
|
||||
cmp al,82h
|
||||
je expression_loop
|
||||
push eax
|
||||
jmp expression_loop
|
||||
expression_element:
|
||||
pop edi
|
||||
or al,al
|
||||
jz expression_element
|
||||
cmp al,82h
|
||||
je expression_loop
|
||||
push eax
|
||||
jmp expression_loop
|
||||
expression_element:
|
||||
mov al,[esi]
|
||||
cmp al,1Ah
|
||||
je expression_number
|
||||
@ -131,17 +131,45 @@ convert_number:
|
||||
cmp al,')'
|
||||
jne invalid_expression
|
||||
ret
|
||||
symbol_value:
|
||||
cmp [source_start],0
|
||||
je preprocessor_value
|
||||
push edi
|
||||
mov edi,address_registers
|
||||
call get_operator
|
||||
or al,al
|
||||
jnz register_value
|
||||
mov edi,directive_operators
|
||||
call get_operator
|
||||
pop edi
|
||||
symbol_value:
|
||||
cmp [source_start],0
|
||||
je preprocessor_value
|
||||
push edi esi
|
||||
lods word [esi]
|
||||
cmp al,1Ah
|
||||
jne no_address_register
|
||||
movzx ecx,ah
|
||||
call get_symbol
|
||||
jc no_address_register
|
||||
cmp al,10h
|
||||
jne no_address_register
|
||||
mov al,ah
|
||||
shr ah,4
|
||||
cmp ah,4
|
||||
je register_value
|
||||
cmp ah,8
|
||||
je register_value
|
||||
cmp ah,0Ch
|
||||
je register_value
|
||||
cmp ah,0Dh
|
||||
je register_value
|
||||
cmp ah,0Fh
|
||||
je register_value
|
||||
cmp ah,2
|
||||
jne no_address_register
|
||||
cmp al,23h
|
||||
je register_value
|
||||
cmp al,25h
|
||||
je register_value
|
||||
cmp al,26h
|
||||
je register_value
|
||||
cmp al,27h
|
||||
je register_value
|
||||
no_address_register:
|
||||
pop esi
|
||||
mov edi,directive_operators
|
||||
call get_operator
|
||||
pop edi
|
||||
or al,al
|
||||
jnz broken_value
|
||||
lods byte [esi]
|
||||
@ -155,13 +183,13 @@ convert_number:
|
||||
stos dword [edi]
|
||||
ret
|
||||
broken_value:
|
||||
mov eax,0Fh
|
||||
jmp store_label_value
|
||||
register_value:
|
||||
pop edi
|
||||
mov byte [edi-1],10h
|
||||
stos byte [edi]
|
||||
ret
|
||||
mov eax,0Fh
|
||||
jmp store_label_value
|
||||
register_value:
|
||||
pop edx edi
|
||||
mov byte [edi-1],10h
|
||||
stos byte [edi]
|
||||
ret
|
||||
preprocessor_value:
|
||||
dec edi
|
||||
cmp [hash_tree],0
|
||||
@ -390,18 +418,18 @@ get_number:
|
||||
cmp al,7
|
||||
ja bad_number
|
||||
oct_digit_ok:
|
||||
xor edx,edx
|
||||
mov cl,bl
|
||||
dec esi
|
||||
cmp bl,63
|
||||
ja oct_out_of_range
|
||||
jne oct_range_ok
|
||||
cmp al,1
|
||||
ja oct_out_of_range
|
||||
oct_range_ok:
|
||||
add bl,3
|
||||
cmp cl,30
|
||||
je oct_digit_wrap
|
||||
xor edx,edx
|
||||
mov cl,bl
|
||||
dec esi
|
||||
cmp bl,63
|
||||
ja oct_out_of_range
|
||||
jne oct_range_ok
|
||||
cmp al,1
|
||||
ja oct_out_of_range
|
||||
oct_range_ok:
|
||||
add bl,3
|
||||
cmp cl,30
|
||||
je oct_digit_wrap
|
||||
ja oct_digit_high
|
||||
shl eax,cl
|
||||
or dword [edi],eax
|
||||
|
@ -35,14 +35,15 @@ formatter:
|
||||
jae out_of_memory
|
||||
cmp [file_extension],0
|
||||
jne extension_specified
|
||||
cmp [output_format],2
|
||||
mov al,[output_format]
|
||||
cmp al,2
|
||||
je exe_extension
|
||||
jb bin_extension
|
||||
cmp [output_format],4
|
||||
cmp al,4
|
||||
je obj_extension
|
||||
cmp [output_format],5
|
||||
cmp al,5
|
||||
je o_extension
|
||||
cmp [output_format],3
|
||||
cmp al,3
|
||||
jne no_extension
|
||||
cmp [subsystem],1
|
||||
je sys_extension
|
||||
@ -164,7 +165,7 @@ formatter:
|
||||
mov [current_offset],edi
|
||||
sub edi,[code_start]
|
||||
mov [code_size],edi
|
||||
mov [written_size],0
|
||||
and [written_size],0
|
||||
mov edx,[output_file]
|
||||
call create
|
||||
jc write_failed
|
||||
@ -324,10 +325,18 @@ public_directive:
|
||||
cmp eax,0Fh
|
||||
jb invalid_use_of_symbol
|
||||
je reserved_word_used_as_symbol
|
||||
inc esi
|
||||
mov dx,[current_pass]
|
||||
mov [eax+18],dx
|
||||
or byte [eax+8],8
|
||||
inc esi
|
||||
cmp [symbols_file],0
|
||||
je public_reference_ok
|
||||
cmp [next_pass_needed],0
|
||||
jne public_reference_ok
|
||||
mov ebx,eax
|
||||
call store_label_reference
|
||||
mov eax,ebx
|
||||
public_reference_ok:
|
||||
mov ebx,[free_additional_memory]
|
||||
lea edx,[ebx+10h]
|
||||
cmp edx,[structures_buffer]
|
||||
@ -395,6 +404,7 @@ extrn_directive:
|
||||
jne invalid_argument
|
||||
extrn_size_ok:
|
||||
mov [address_symbol],edx
|
||||
mov [label_size],ah
|
||||
movzx ecx,ah
|
||||
mov [edx+8],ecx
|
||||
xor eax,eax
|
||||
@ -485,6 +495,7 @@ mz_segment:
|
||||
rep stos byte [edi]
|
||||
mov dword [org_origin],edi
|
||||
mov dword [org_origin+4],eax
|
||||
mov [org_origin_sign],al
|
||||
mov [org_registers],eax
|
||||
mov [org_start],edi
|
||||
mov eax,edx
|
||||
@ -503,7 +514,8 @@ mz_segment:
|
||||
segment_type_ok:
|
||||
mov [code_type],al
|
||||
mov eax,edx
|
||||
mov cx,0100h
|
||||
mov ch,1
|
||||
mov [label_size],0
|
||||
xor edx,edx
|
||||
xor ebp,ebp
|
||||
mov [address_symbol],edx
|
||||
@ -515,11 +527,7 @@ mz_entry:
|
||||
call get_word_value
|
||||
cmp [value_type],1
|
||||
je initial_cs_ok
|
||||
cmp [error_line],0
|
||||
jne initial_cs_ok
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],invalid_address
|
||||
call recoverable_invalid_address
|
||||
initial_cs_ok:
|
||||
mov edx,[additional_memory]
|
||||
mov [edx+16h],ax
|
||||
@ -536,6 +544,14 @@ mz_entry:
|
||||
mov edx,[additional_memory]
|
||||
mov [edx+14h],ax
|
||||
jmp instruction_assembled
|
||||
recoverable_invalid_address:
|
||||
cmp [error_line],0
|
||||
jne ignore_invalid_address
|
||||
push [current_line]
|
||||
pop [error_line]
|
||||
mov [error],invalid_address
|
||||
ignore_invalid_address:
|
||||
ret
|
||||
mz_stack:
|
||||
lods byte [esi]
|
||||
cmp al,'('
|
||||
@ -553,11 +569,7 @@ mz_stack:
|
||||
stack_pointer:
|
||||
cmp [value_type],1
|
||||
je initial_ss_ok
|
||||
cmp [error_line],0
|
||||
jne initial_ss_ok
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],invalid_address
|
||||
call recoverable_invalid_address
|
||||
initial_ss_ok:
|
||||
mov edx,[additional_memory]
|
||||
mov [edx+0Eh],ax
|
||||
@ -834,7 +846,7 @@ format_pe:
|
||||
mov [subsystem],3
|
||||
mov [subsystem_version],3 + 10 shl 16
|
||||
mov [image_base],400000h
|
||||
mov [image_base_high],0
|
||||
and [image_base_high],0
|
||||
test [format_flags],8
|
||||
jz pe_settings
|
||||
mov [machine],8664h
|
||||
@ -1061,7 +1073,7 @@ format_pe:
|
||||
jc pe_entry_init_ok
|
||||
mov [edx+28h],eax ; entry point rva
|
||||
pe_entry_init_ok:
|
||||
mov [number_of_sections],0
|
||||
and [number_of_sections],0
|
||||
movzx ebx,word [edx+14h]
|
||||
lea ebx,[edx+18h+ebx]
|
||||
mov [current_section],ebx
|
||||
@ -1071,38 +1083,45 @@ format_pe:
|
||||
mov [ebx+0Ch],eax
|
||||
mov dword [ebx+24h],0E0000060h
|
||||
xor ecx,ecx
|
||||
xor bl,bl
|
||||
not eax
|
||||
not ecx
|
||||
not bl
|
||||
add eax,1
|
||||
adc ecx,0
|
||||
adc bl,0
|
||||
add eax,edi
|
||||
adc ecx,0
|
||||
adc bl,0
|
||||
test [format_flags],4
|
||||
jnz peplus_org
|
||||
sub eax,[edx+34h]
|
||||
sbb ecx,0
|
||||
sbb bl,0
|
||||
jmp pe_org_ok
|
||||
peplus_org:
|
||||
sub eax,[edx+30h]
|
||||
sbb ecx,[edx+34h]
|
||||
sbb bl,0
|
||||
pe_org_ok:
|
||||
test [format_flags],8
|
||||
jnz pe64_code
|
||||
mov bl,2
|
||||
mov bh,2
|
||||
mov [code_type],32
|
||||
jmp pe_code_type_ok
|
||||
pe64_code:
|
||||
mov bl,4
|
||||
mov bh,4
|
||||
mov [code_type],64
|
||||
pe_code_type_ok:
|
||||
bt [resolver_flags],0
|
||||
jc pe_labels_type_ok
|
||||
xor bl,bl
|
||||
xor bh,bh
|
||||
pe_labels_type_ok:
|
||||
mov [labels_type],bl
|
||||
mov [labels_type],bh
|
||||
mov dword [org_origin],eax
|
||||
mov dword [org_origin+4],ecx
|
||||
mov [org_registers],0
|
||||
mov [org_origin_sign],bl
|
||||
and [org_registers],0
|
||||
mov [org_start],edi
|
||||
bt [format_flags],8
|
||||
jnc dll_flag_ok
|
||||
@ -1155,13 +1174,15 @@ pe_section:
|
||||
mov esi,edx
|
||||
rep movs byte [edi],[esi]
|
||||
pop edi esi
|
||||
mov dword [ebx+24h],0
|
||||
and dword [ebx+24h],0
|
||||
mov [ebx+14h],edi
|
||||
mov edx,[code_start]
|
||||
mov eax,edi
|
||||
xor ecx,ecx
|
||||
mov [org_origin_sign],0
|
||||
sub eax,[ebx+0Ch]
|
||||
sbb ecx,0
|
||||
sbb [org_origin_sign],0
|
||||
mov [labels_type],2
|
||||
mov [code_type],32
|
||||
test [format_flags],8
|
||||
@ -1173,6 +1194,7 @@ pe_section:
|
||||
jnz peplus_section_org
|
||||
sub eax,[edx+34h]
|
||||
sbb ecx,0
|
||||
sbb [org_origin_sign],0
|
||||
bt [resolver_flags],0
|
||||
jc pe_section_org_ok
|
||||
mov [labels_type],0
|
||||
@ -1180,13 +1202,14 @@ pe_section:
|
||||
peplus_section_org:
|
||||
sub eax,[edx+30h]
|
||||
sbb ecx,[edx+34h]
|
||||
sbb [org_origin_sign],0
|
||||
bt [resolver_flags],0
|
||||
jc pe_section_org_ok
|
||||
mov [labels_type],0
|
||||
pe_section_org_ok:
|
||||
mov dword [org_origin],eax
|
||||
mov dword [org_origin+4],ecx
|
||||
mov [org_registers],0
|
||||
and [org_registers],0
|
||||
mov [org_start],edi
|
||||
get_section_flags:
|
||||
lods byte [esi]
|
||||
@ -1246,7 +1269,7 @@ pe_section:
|
||||
jb align_section
|
||||
mov edi,[undefined_data_start]
|
||||
align_section:
|
||||
mov [undefined_data_end],0
|
||||
and [undefined_data_end],0
|
||||
mov ebp,edi
|
||||
sub ebp,[ebx+14h]
|
||||
mov ecx,[edx+3Ch]
|
||||
@ -1373,11 +1396,7 @@ pe_entry:
|
||||
check_pe_entry_label_type:
|
||||
cmp [value_type],bl
|
||||
je pe_entry_ok
|
||||
cmp [error_line],0
|
||||
jne pe_entry_ok
|
||||
mov edx,[current_line]
|
||||
mov [error_line],edx
|
||||
mov [error],invalid_address
|
||||
call recoverable_invalid_address
|
||||
pe_entry_ok:
|
||||
cdq
|
||||
test [format_flags],4
|
||||
@ -1395,19 +1414,13 @@ pe_entry:
|
||||
check_pe64_entry_label_type:
|
||||
cmp [value_type],bl
|
||||
je pe64_entry_type_ok
|
||||
cmp [error_line],0
|
||||
jne pe64_entry_type_ok
|
||||
mov edx,[current_line]
|
||||
mov [error_line],edx
|
||||
mov [error],invalid_address
|
||||
call recoverable_invalid_address
|
||||
pe64_entry_type_ok:
|
||||
mov ecx,[code_start]
|
||||
sub eax,[ecx+30h]
|
||||
sbb edx,[ecx+34h]
|
||||
jz pe64_entry_range_ok
|
||||
mov edx,[current_line]
|
||||
mov [error_line],edx
|
||||
mov [error],value_out_of_range
|
||||
call recoverable_overflow
|
||||
pe64_entry_range_ok:
|
||||
mov [ecx+28h],eax
|
||||
jmp instruction_assembled
|
||||
@ -1540,11 +1553,7 @@ mark_pe_relocation:
|
||||
check_standard_pe_relocation_type:
|
||||
cmp [value_type],2
|
||||
je pe_relocation_type_ok
|
||||
cmp [error_line],0
|
||||
jne pe_relocation_type_ok
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],invalid_use_of_symbol
|
||||
call recoverable_misuse
|
||||
pe_relocation_type_ok:
|
||||
mov ebx,[current_section]
|
||||
mov eax,edi
|
||||
@ -1580,7 +1589,7 @@ make_pe_fixups:
|
||||
jc fixups_ready
|
||||
or [next_pass_needed],-1
|
||||
fixups_ready:
|
||||
mov [last_fixup_base],0
|
||||
and [last_fixup_base],0
|
||||
call make_fixups
|
||||
xchg eax,[actual_fixups_size]
|
||||
sub eax,[actual_fixups_size]
|
||||
@ -1652,7 +1661,7 @@ make_pe_resource:
|
||||
je resource_from_file
|
||||
cmp [current_pass],0
|
||||
jne reserve_space_for_resource
|
||||
mov [resource_size],0
|
||||
and [resource_size],0
|
||||
reserve_space_for_resource:
|
||||
add edi,[resource_size]
|
||||
cmp edi,[display_buffer]
|
||||
@ -2310,18 +2319,28 @@ format_coff:
|
||||
mov [current_section],ebx
|
||||
xor eax,eax
|
||||
mov [number_of_sections],eax
|
||||
mov dword [org_origin],edi
|
||||
mov dword [org_origin+4],eax
|
||||
mov [org_registers],eax
|
||||
mov [org_start],edi
|
||||
mov [org_symbol],ebx
|
||||
mov [labels_type],2
|
||||
call setup_coff_section_org
|
||||
mov [code_type],32
|
||||
test [format_flags],8
|
||||
jz format_defined
|
||||
mov [labels_type],4
|
||||
mov [code_type],64
|
||||
jmp format_defined
|
||||
setup_coff_section_org:
|
||||
xor eax,eax
|
||||
mov dword [org_origin],edi
|
||||
mov dword [org_origin+4],eax
|
||||
mov [org_origin_sign],al
|
||||
mov [org_registers],eax
|
||||
mov [org_start],edi
|
||||
mov [org_symbol],ebx
|
||||
test [format_flags],8
|
||||
jnz coff_64bit_labels
|
||||
mov [labels_type],2
|
||||
ret
|
||||
coff_64bit_labels:
|
||||
mov [labels_type],4
|
||||
ret
|
||||
|
||||
coff_section:
|
||||
call close_coff_section
|
||||
mov ebx,[free_additional_memory]
|
||||
@ -2334,18 +2353,9 @@ coff_section:
|
||||
xor eax,eax
|
||||
mov [ebx],al
|
||||
mov [ebx+8],edi
|
||||
mov dword [org_origin],edi
|
||||
mov dword [org_origin+4],eax
|
||||
mov [org_registers],eax
|
||||
mov [org_start],edi
|
||||
mov [org_symbol],ebx
|
||||
mov [labels_type],2
|
||||
test [format_flags],8
|
||||
jz coff_labels_type_ok
|
||||
mov [labels_type],4
|
||||
coff_labels_type_ok:
|
||||
mov [ebx+10h],eax
|
||||
mov [ebx+14h],eax
|
||||
call setup_coff_section_org
|
||||
lods word [esi]
|
||||
cmp ax,'('
|
||||
jne invalid_argument
|
||||
@ -2552,8 +2562,8 @@ coff_formatter:
|
||||
mov edx,[esi+8]
|
||||
add esi,10h
|
||||
inc eax
|
||||
cmp byte [edx+11],2
|
||||
jne enumerate_symbols
|
||||
cmp byte [edx+11],0
|
||||
je enumerate_symbols
|
||||
mov edx,[edx+20]
|
||||
cmp byte [edx],0C0h
|
||||
jae enumerate_symbols
|
||||
@ -2803,13 +2813,14 @@ coff_formatter:
|
||||
mov cx,[ecx+1Eh]
|
||||
mov [ebx+0Ch],cx
|
||||
public_symbol_section_ok:
|
||||
cmp dword [eax+4],0
|
||||
je store_public_symbol
|
||||
cmp dword [eax+4],-1
|
||||
movzx ecx,byte [eax+9]
|
||||
shr cl,1
|
||||
and cl,1
|
||||
neg ecx
|
||||
cmp ecx,[eax+4]
|
||||
jne value_out_of_range
|
||||
bt dword [eax],31
|
||||
jnc value_out_of_range
|
||||
store_public_symbol:
|
||||
xor ecx,[eax]
|
||||
js value_out_of_range
|
||||
mov eax,[eax]
|
||||
mov [ebx+8],eax
|
||||
mov al,2
|
||||
@ -2850,7 +2861,7 @@ coff_formatter:
|
||||
mov [edx],eax
|
||||
sub edi,[code_start]
|
||||
mov [code_size],edi
|
||||
mov [written_size],0
|
||||
and [written_size],0
|
||||
mov edx,[output_file]
|
||||
call create
|
||||
jc write_failed
|
||||
@ -2910,7 +2921,6 @@ format_elf:
|
||||
mov [code_type],32
|
||||
cmp word [esi],1D19h
|
||||
je format_elf_exe
|
||||
mov [labels_type],2
|
||||
elf_header_ok:
|
||||
mov byte [edx+10h],1
|
||||
mov eax,[additional_memory]
|
||||
@ -2923,11 +2933,6 @@ format_elf:
|
||||
xor eax,eax
|
||||
mov [current_section],ebx
|
||||
mov [number_of_sections],eax
|
||||
mov dword [org_origin],edi
|
||||
mov dword [org_origin+4],eax
|
||||
mov [org_registers],eax
|
||||
mov [org_start],edi
|
||||
mov [org_symbol],ebx
|
||||
mov [ebx],al
|
||||
mov [ebx+4],eax
|
||||
mov [ebx+8],edi
|
||||
@ -2935,6 +2940,7 @@ format_elf:
|
||||
mov [ebx+14h],eax
|
||||
mov al,4
|
||||
mov [ebx+10h],eax
|
||||
call setup_coff_section_org
|
||||
test [format_flags],8
|
||||
jz format_defined
|
||||
mov byte [ebx+10h],8
|
||||
@ -2958,9 +2964,8 @@ format_elf:
|
||||
mov byte [edx+3Ah],40h
|
||||
mov [code_type],64
|
||||
cmp word [esi],1D19h
|
||||
je format_elf64_exe
|
||||
mov [labels_type],4
|
||||
jmp elf_header_ok
|
||||
jne elf_header_ok
|
||||
jmp format_elf64_exe
|
||||
elf_section:
|
||||
bt [format_flags],0
|
||||
jc illegal_instruction
|
||||
@ -2976,21 +2981,10 @@ elf_section:
|
||||
xor eax,eax
|
||||
mov [ebx],al
|
||||
mov [ebx+8],edi
|
||||
mov dword [org_origin],edi
|
||||
mov dword [org_origin+4],eax
|
||||
mov [org_registers],eax
|
||||
mov [org_start],edi
|
||||
mov [org_symbol],ebx
|
||||
test [format_flags],8
|
||||
jnz elf64_labels_type
|
||||
mov [labels_type],2
|
||||
jmp elf_labels_type_ok
|
||||
elf64_labels_type:
|
||||
mov [labels_type],4
|
||||
elf_labels_type_ok:
|
||||
mov [ebx+10h],eax
|
||||
mov al,10b
|
||||
mov [ebx+14h],eax
|
||||
call setup_coff_section_org
|
||||
lods word [esi]
|
||||
cmp ax,'('
|
||||
jne invalid_argument
|
||||
@ -3218,8 +3212,7 @@ elf_formatter:
|
||||
mov dx,[eax+0Eh]
|
||||
jmp section_for_public_ok
|
||||
undefined_public:
|
||||
mov eax,[ebx+24]
|
||||
mov [error_info],eax
|
||||
mov [error_info],ebx
|
||||
jmp undefined_symbol
|
||||
elf64_public:
|
||||
cmp dl,4
|
||||
@ -3233,7 +3226,15 @@ elf_formatter:
|
||||
stos dword [edi]
|
||||
test [format_flags],8
|
||||
jnz elf64_public_symbol
|
||||
call get_public_value
|
||||
movzx eax,byte [ebx+9]
|
||||
shr al,1
|
||||
and al,1
|
||||
neg eax
|
||||
cmp eax,[ebx+4]
|
||||
jne value_out_of_range
|
||||
xor eax,[ebx]
|
||||
js value_out_of_range
|
||||
mov eax,[ebx]
|
||||
stos dword [edi]
|
||||
xor eax,eax
|
||||
mov al,[ebx+10]
|
||||
@ -3262,9 +3263,13 @@ elf_formatter:
|
||||
or al,2
|
||||
store_elf64_public_info:
|
||||
stos dword [edi]
|
||||
call get_public_value
|
||||
mov al,[ebx+9]
|
||||
shl eax,31-1
|
||||
xor eax,[ebx+4]
|
||||
js value_out_of_range
|
||||
mov eax,[ebx]
|
||||
stos dword [edi]
|
||||
xor eax,eax
|
||||
mov eax,[ebx+4]
|
||||
stos dword [edi]
|
||||
mov al,[ebx+10]
|
||||
stos dword [edi]
|
||||
@ -3278,16 +3283,6 @@ elf_formatter:
|
||||
mov [esi],eax
|
||||
add esi,10h
|
||||
jmp find_other_symbols
|
||||
get_public_value:
|
||||
mov eax,[ebx]
|
||||
cmp dword [ebx+4],0
|
||||
je public_value_ok
|
||||
cmp dword [ebx+4],-1
|
||||
jne value_out_of_range
|
||||
bt eax,31
|
||||
jnc value_out_of_range
|
||||
public_value_ok:
|
||||
ret
|
||||
make_extrn_symbol:
|
||||
mov eax,[esi+4]
|
||||
stos dword [edi]
|
||||
@ -3488,7 +3483,7 @@ elf_formatter:
|
||||
stos dword [edi]
|
||||
test [format_flags],8
|
||||
jz elf_machine_word_ok
|
||||
mov dword [edi],0
|
||||
and dword [edi],0
|
||||
add edi,4
|
||||
elf_machine_word_ok:
|
||||
ret
|
||||
@ -3669,27 +3664,36 @@ format_elf_exe:
|
||||
init_elf_segments:
|
||||
xor eax,eax
|
||||
rep stos dword [edi]
|
||||
mov [number_of_sections],0
|
||||
and [number_of_sections],0
|
||||
mov byte [ebx],1
|
||||
mov word [ebx+1Ch],1000h
|
||||
mov byte [ebx+18h],111b
|
||||
mov eax,edi
|
||||
xor ebp,ebp
|
||||
xor cl,cl
|
||||
sub eax,[code_start]
|
||||
sbb ebp,0
|
||||
sbb cl,0
|
||||
mov [ebx+4],eax
|
||||
add eax,[image_base]
|
||||
adc ebp,0
|
||||
adc cl,0
|
||||
mov [ebx+8],eax
|
||||
mov [ebx+0Ch],eax
|
||||
mov [edx+18h],eax
|
||||
xor edx,edx
|
||||
not eax
|
||||
not edx
|
||||
not ebp
|
||||
not cl
|
||||
add eax,1
|
||||
adc edx,0
|
||||
adc ebp,0
|
||||
adc cl,0
|
||||
add eax,edi
|
||||
adc edx,0
|
||||
adc ebp,0
|
||||
adc cl,0
|
||||
mov dword [org_origin],eax
|
||||
mov dword [org_origin+4],edx
|
||||
mov [org_registers],0
|
||||
mov [org_origin_sign],cl
|
||||
and [org_registers],0
|
||||
mov [org_start],edi
|
||||
mov [symbols_stream],edi
|
||||
jmp format_defined
|
||||
@ -3709,7 +3713,7 @@ format_elf_exe:
|
||||
mov [edx+7],al
|
||||
elf64_exe_brand_ok:
|
||||
mov [image_base],400000h
|
||||
mov [image_base_high],0
|
||||
and [image_base_high],0
|
||||
cmp byte [esi],80h
|
||||
jne elf64_exe_base_ok
|
||||
lods word [esi]
|
||||
@ -3735,7 +3739,7 @@ format_elf_exe:
|
||||
init_elf64_segments:
|
||||
xor eax,eax
|
||||
rep stos dword [edi]
|
||||
mov [number_of_sections],0
|
||||
and [number_of_sections],0
|
||||
mov byte [ebx],1
|
||||
mov word [ebx+30h],1000h
|
||||
mov byte [ebx+4],111b
|
||||
@ -3744,8 +3748,10 @@ format_elf_exe:
|
||||
sub eax,[code_start]
|
||||
mov [ebx+8],eax
|
||||
xor edx,edx
|
||||
xor cl,cl
|
||||
add eax,[image_base]
|
||||
adc edx,[image_base_high]
|
||||
adc cl,0
|
||||
mov [ebx+10h],eax
|
||||
mov [ebx+10h+4],edx
|
||||
mov [ebx+18h],eax
|
||||
@ -3755,13 +3761,17 @@ format_elf_exe:
|
||||
mov [ebx+18h+4],edx
|
||||
not eax
|
||||
not edx
|
||||
not cl
|
||||
add eax,1
|
||||
adc edx,0
|
||||
adc cl,0
|
||||
add eax,edi
|
||||
adc edx,0
|
||||
adc cl,0
|
||||
mov dword [org_origin],eax
|
||||
mov dword [org_origin+4],edx
|
||||
mov [org_registers],0
|
||||
mov [org_origin_sign],cl
|
||||
and [org_registers],0
|
||||
mov [org_start],edi
|
||||
mov [symbols_stream],edi
|
||||
jmp format_defined
|
||||
@ -3863,15 +3873,20 @@ elf_segment:
|
||||
mov [ebx+0Ch],edx
|
||||
mov eax,edx
|
||||
xor edx,edx
|
||||
xor cl,cl
|
||||
not eax
|
||||
not edx
|
||||
not cl
|
||||
add eax,1
|
||||
adc edx,0
|
||||
adc cl,0
|
||||
add eax,edi
|
||||
adc edx,0
|
||||
adc cl,0
|
||||
mov dword [org_origin],eax
|
||||
mov dword [org_origin+4],edx
|
||||
mov [org_registers],0
|
||||
mov [org_origin_sign],cl
|
||||
and [org_registers],0
|
||||
mov [org_start],edi
|
||||
inc [number_of_sections]
|
||||
jmp instruction_assembled
|
||||
@ -3990,15 +4005,20 @@ elf_segment:
|
||||
mov [ebx+10h+4],edx
|
||||
mov [ebx+18h],eax
|
||||
mov [ebx+18h+4],edx
|
||||
xor cl,cl
|
||||
not eax
|
||||
not edx
|
||||
not cl
|
||||
add eax,1
|
||||
adc edx,0
|
||||
adc cl,0
|
||||
add eax,edi
|
||||
adc edx,0
|
||||
adc cl,0
|
||||
mov dword [org_origin],eax
|
||||
mov dword [org_origin+4],edx
|
||||
mov [org_registers],0
|
||||
mov [org_origin_sign],cl
|
||||
and [org_registers],0
|
||||
mov [org_start],edi
|
||||
inc [number_of_sections]
|
||||
jmp instruction_assembled
|
||||
|
@ -1,9 +1,9 @@
|
||||
|
||||
; flat assembler core
|
||||
; Copyright (c) 1999-2012, Tomasz Grysztar.
|
||||
; All rights reserved.
|
||||
|
||||
_out_of_memory db 'out of memory',0
|
||||
|
||||
; flat assembler core
|
||||
; Copyright (c) 1999-2012, Tomasz Grysztar.
|
||||
; All rights reserved.
|
||||
|
||||
_out_of_memory db 'out of memory',0
|
||||
_stack_overflow db 'out of stack space',0
|
||||
_main_file_not_found db 'source file not found',0
|
||||
_unexpected_end_of_file db 'unexpected end of file',0
|
||||
@ -22,13 +22,13 @@ _illegal_instruction db 'illegal instruction',0
|
||||
_invalid_operand db 'invalid operand',0
|
||||
_invalid_operand_size db 'invalid size of operand',0
|
||||
_operand_size_not_specified db 'operand size not specified',0
|
||||
_operand_sizes_do_not_match db 'operand sizes do not match',0
|
||||
_invalid_address_size db 'invalid size of address value',0
|
||||
_address_sizes_do_not_agree db 'address sizes do not agree',0
|
||||
_prefix_conflict db 'disallowed combination of registers',0
|
||||
_long_immediate_not_encodable db 'not encodable with long immediate',0
|
||||
_relative_jump_out_of_range db 'relative jump out of range',0
|
||||
_invalid_expression db 'invalid expression',0
|
||||
_operand_sizes_do_not_match db 'operand sizes do not match',0
|
||||
_invalid_address_size db 'invalid size of address value',0
|
||||
_address_sizes_do_not_agree db 'address sizes do not agree',0
|
||||
_disallowed_combination_of_registers db 'disallowed combination of registers',0
|
||||
_long_immediate_not_encodable db 'not encodable with long immediate',0
|
||||
_relative_jump_out_of_range db 'relative jump out of range',0
|
||||
_invalid_expression db 'invalid expression',0
|
||||
_invalid_address db 'invalid address',0
|
||||
_invalid_value db 'invalid value',0
|
||||
_value_out_of_range db 'value out of range',0
|
||||
@ -45,8 +45,8 @@ _missing_end_directive db 'missing end directive',0
|
||||
_unexpected_instruction db 'unexpected instruction',0
|
||||
_extra_characters_on_line db 'extra characters on line',0
|
||||
_section_not_aligned_enough db 'section is not aligned enough',0
|
||||
_setting_already_specified db 'setting already specified',0
|
||||
_data_already_defined db 'data already defined',0
|
||||
_too_many_repeats db 'too many repeats',0
|
||||
_invoked_error db 'error directive invoked in source file',0
|
||||
_assertion_failed db 'assertion failed',0
|
||||
_setting_already_specified db 'setting already specified',0
|
||||
_data_already_defined db 'data already defined',0
|
||||
_too_many_repeats db 'too many repeats',0
|
||||
_invoked_error db 'error directive invoked in source file',0
|
||||
_assertion_failed db 'assertion failed',0
|
@ -503,7 +503,7 @@ parse_line_contents:
|
||||
cmp al,','
|
||||
je separator
|
||||
cmp al,'='
|
||||
je separator
|
||||
je expression_comparator
|
||||
cmp al,'|'
|
||||
je separator
|
||||
cmp al,'&'
|
||||
@ -569,7 +569,11 @@ parse_line_contents:
|
||||
je parse_from_operator
|
||||
cmp al,89h
|
||||
je parse_label_operator
|
||||
cmp al,0F8h
|
||||
je forced_expression
|
||||
jmp argument_parsed
|
||||
instruction_separator:
|
||||
stos byte [edi]
|
||||
allow_embedded_instruction:
|
||||
cmp byte [esi],1Ah
|
||||
jne parse_argument
|
||||
@ -810,6 +814,29 @@ parse_line_contents:
|
||||
stos byte [edi]
|
||||
inc [parenthesis_stack]
|
||||
jmp parse_argument
|
||||
expression_comparator:
|
||||
stos byte [edi]
|
||||
jmp forced_expression
|
||||
greater:
|
||||
cmp byte [esi],'='
|
||||
jne separator
|
||||
inc esi
|
||||
mov al,0F2h
|
||||
jmp separator
|
||||
less:
|
||||
cmp byte [edi-1],0F6h
|
||||
je separator
|
||||
cmp byte [esi],'>'
|
||||
je not_equal
|
||||
cmp byte [esi],'='
|
||||
jne separator
|
||||
inc esi
|
||||
mov al,0F3h
|
||||
jmp separator
|
||||
not_equal:
|
||||
inc esi
|
||||
mov al,0F1h
|
||||
jmp expression_comparator
|
||||
expression:
|
||||
mov al,'('
|
||||
stos byte [edi]
|
||||
@ -892,30 +919,6 @@ parse_line_contents:
|
||||
mov al,'}'
|
||||
separator:
|
||||
stos byte [edi]
|
||||
jmp argument_parsed
|
||||
instruction_separator:
|
||||
stos byte [edi]
|
||||
jmp allow_embedded_instruction
|
||||
greater:
|
||||
cmp byte [esi],'='
|
||||
jne separator
|
||||
inc esi
|
||||
mov al,0F2h
|
||||
jmp separator
|
||||
less:
|
||||
cmp byte [edi-1],0F6h
|
||||
je separator
|
||||
cmp byte [esi],'>'
|
||||
je not_equal
|
||||
cmp byte [esi],'='
|
||||
jne separator
|
||||
inc esi
|
||||
mov al,0F3h
|
||||
jmp separator
|
||||
not_equal:
|
||||
inc esi
|
||||
mov al,0F1h
|
||||
jmp separator
|
||||
argument_parsed:
|
||||
cmp [parenthesis_stack],0
|
||||
je parse_argument
|
||||
@ -984,6 +987,7 @@ get_operator:
|
||||
jne next_operator
|
||||
repe cmps byte [esi],[edi]
|
||||
je operator_found
|
||||
jb no_operator
|
||||
next_operator:
|
||||
mov edi,ebx
|
||||
inc edi
|
||||
@ -1046,12 +1050,10 @@ get_symbol:
|
||||
ja symbols_up
|
||||
jb symbols_down
|
||||
mov ax,[edi]
|
||||
|
||||
cmp al,18h
|
||||
jb symbol_ok
|
||||
cmp [formatter_symbols_allowed],0
|
||||
je no_symbol
|
||||
|
||||
symbol_ok:
|
||||
pop esi
|
||||
add esi,ebp
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,28 +1,28 @@
|
||||
|
||||
; flat assembler core
|
||||
; Copyright (c) 1999-2012, Tomasz Grysztar.
|
||||
; All rights reserved.
|
||||
|
||||
dump_symbols:
|
||||
|
||||
; flat assembler core
|
||||
; Copyright (c) 1999-2012, Tomasz Grysztar.
|
||||
; All rights reserved.
|
||||
|
||||
dump_symbols:
|
||||
mov edi,[code_start]
|
||||
call setup_dump_header
|
||||
mov esi,[input_file]
|
||||
call copy_asciiz
|
||||
cmp edi,[display_buffer]
|
||||
jae out_of_memory
|
||||
mov eax,edi
|
||||
sub eax,ebx
|
||||
mov [ebx-38h+0Ch],eax
|
||||
mov esi,[output_file]
|
||||
call copy_asciiz
|
||||
cmp edi,[display_buffer]
|
||||
jae out_of_memory
|
||||
mov edx,[symbols_stream]
|
||||
mov ebp,[free_additional_memory]
|
||||
mov [number_of_sections],0
|
||||
cmp [output_format],4
|
||||
je prepare_strings_table
|
||||
cmp [output_format],5
|
||||
jae out_of_memory
|
||||
mov eax,edi
|
||||
sub eax,ebx
|
||||
mov [ebx-40h+0Ch],eax
|
||||
mov esi,[output_file]
|
||||
call copy_asciiz
|
||||
cmp edi,[display_buffer]
|
||||
jae out_of_memory
|
||||
mov edx,[symbols_stream]
|
||||
mov ebp,[free_additional_memory]
|
||||
and [number_of_sections],0
|
||||
cmp [output_format],4
|
||||
je prepare_strings_table
|
||||
cmp [output_format],5
|
||||
jne strings_table_ready
|
||||
bt [format_flags],0
|
||||
jc strings_table_ready
|
||||
@ -149,40 +149,45 @@ dump_symbols:
|
||||
label_used_flag_ok:
|
||||
add edx,LABEL_STRUCTURE_SIZE
|
||||
jmp prepare_labels_dump
|
||||
labels_dump_ok:
|
||||
mov eax,edi
|
||||
sub eax,ebx
|
||||
mov [ebx-38h+14h],eax
|
||||
add eax,38h
|
||||
mov [ebx-38h+18h],eax
|
||||
mov ecx,[memory_end]
|
||||
sub ecx,[labels_list]
|
||||
mov [ebx-38h+1Ch],ecx
|
||||
add eax,ecx
|
||||
mov [ebx-38h+20h],eax
|
||||
mov ecx,[source_start]
|
||||
sub ecx,[memory_start]
|
||||
mov [ebx-38h+24h],ecx
|
||||
add eax,ecx
|
||||
mov [ebx-38h+28h],eax
|
||||
mov eax,[number_of_sections]
|
||||
shl eax,2
|
||||
mov [ebx-38h+34h],eax
|
||||
call prepare_preprocessed_source
|
||||
mov esi,[labels_list]
|
||||
mov ebp,edi
|
||||
labels_dump_ok:
|
||||
mov eax,edi
|
||||
sub eax,ebx
|
||||
mov [ebx-40h+14h],eax
|
||||
add eax,40h
|
||||
mov [ebx-40h+18h],eax
|
||||
mov ecx,[memory_end]
|
||||
sub ecx,[labels_list]
|
||||
mov [ebx-40h+1Ch],ecx
|
||||
add eax,ecx
|
||||
mov [ebx-40h+20h],eax
|
||||
mov ecx,[source_start]
|
||||
sub ecx,[memory_start]
|
||||
mov [ebx-40h+24h],ecx
|
||||
add eax,ecx
|
||||
mov [ebx-40h+28h],eax
|
||||
mov eax,[number_of_sections]
|
||||
shl eax,2
|
||||
mov [ebx-40h+34h],eax
|
||||
call prepare_preprocessed_source
|
||||
mov esi,[labels_list]
|
||||
mov ebp,edi
|
||||
make_lines_dump:
|
||||
cmp esi,[display_buffer]
|
||||
je lines_dump_ok
|
||||
mov eax,[esi-4]
|
||||
mov ecx,[esi-8]
|
||||
sub esi,8
|
||||
sub esi,ecx
|
||||
cmp eax,1
|
||||
jne make_lines_dump
|
||||
mov eax,[esi+4]
|
||||
sub eax,[code_start]
|
||||
add eax,[headers_size]
|
||||
sub esi,8
|
||||
sub esi,ecx
|
||||
cmp eax,1
|
||||
je process_line_dump
|
||||
cmp eax,2
|
||||
jne make_lines_dump
|
||||
add dword [ebx-40h+3Ch],8
|
||||
jmp make_lines_dump
|
||||
process_line_dump:
|
||||
mov eax,[esi+4]
|
||||
sub eax,[code_start]
|
||||
add eax,[headers_size]
|
||||
cmp byte [esi+1Ah],0
|
||||
je store_offset
|
||||
xor eax,eax
|
||||
@ -190,14 +195,16 @@ dump_symbols:
|
||||
stos dword [edi]
|
||||
mov eax,[esi]
|
||||
sub eax,[memory_start]
|
||||
stos dword [edi]
|
||||
mov eax,[esi+4]
|
||||
xor edx,edx
|
||||
sub eax,[esi+8]
|
||||
sbb edx,[esi+8+4]
|
||||
stos dword [edi]
|
||||
mov eax,edx
|
||||
stos dword [edi]
|
||||
stos dword [edi]
|
||||
mov eax,[esi+4]
|
||||
xor edx,edx
|
||||
xor cl,cl
|
||||
sub eax,[esi+8]
|
||||
sbb edx,[esi+8+4]
|
||||
sbb cl,[esi+1Bh]
|
||||
stos dword [edi]
|
||||
mov eax,edx
|
||||
stos dword [edi]
|
||||
mov eax,[esi+10h]
|
||||
stos dword [edi]
|
||||
mov eax,[esi+14h]
|
||||
@ -207,50 +214,57 @@ dump_symbols:
|
||||
mov eax,[eax+4]
|
||||
jae base_symbol_for_line_ok
|
||||
xor eax,eax
|
||||
base_symbol_for_line_ok:
|
||||
stos dword [edi]
|
||||
mov eax,[esi+18h]
|
||||
and eax,001FFFFh
|
||||
stos dword [edi]
|
||||
cmp edi,[display_buffer]
|
||||
jae out_of_memory
|
||||
jmp make_lines_dump
|
||||
lines_dump_ok:
|
||||
mov edx,edi
|
||||
base_symbol_for_line_ok:
|
||||
stos dword [edi]
|
||||
mov eax,[esi+18h]
|
||||
and eax,01FFFFh
|
||||
stos dword [edi]
|
||||
mov [edi-1],cl
|
||||
cmp edi,[display_buffer]
|
||||
jae out_of_memory
|
||||
mov eax,edi
|
||||
sub eax,1Ch
|
||||
sub eax,ebp
|
||||
mov [esi],eax
|
||||
jmp make_lines_dump
|
||||
lines_dump_ok:
|
||||
mov edx,edi
|
||||
mov eax,[current_offset]
|
||||
sub eax,[code_start]
|
||||
add eax,[headers_size]
|
||||
stos dword [edi]
|
||||
mov ecx,edi
|
||||
sub ecx,ebx
|
||||
sub ecx,[ebx-38h+14h]
|
||||
mov [ebx-38h+2Ch],ecx
|
||||
add ecx,[ebx-38h+28h]
|
||||
mov [ebx-38h+30h],ecx
|
||||
find_inexisting_offsets:
|
||||
sub edx,1Ch
|
||||
cmp edx,ebp
|
||||
stos dword [edi]
|
||||
mov ecx,edi
|
||||
sub ecx,ebx
|
||||
sub ecx,[ebx-40h+14h]
|
||||
mov [ebx-40h+2Ch],ecx
|
||||
add ecx,[ebx-40h+28h]
|
||||
mov [ebx-40h+30h],ecx
|
||||
add ecx,[ebx-40h+34h]
|
||||
mov [ebx-40h+38h],ecx
|
||||
find_inexisting_offsets:
|
||||
sub edx,1Ch
|
||||
cmp edx,ebp
|
||||
jb write_symbols
|
||||
test byte [edx+1Ah],1
|
||||
jnz find_inexisting_offsets
|
||||
cmp eax,[edx]
|
||||
jb correct_inexisting_offset
|
||||
mov eax,[edx]
|
||||
jmp find_inexisting_offsets
|
||||
correct_inexisting_offset:
|
||||
mov dword [edx],0
|
||||
or byte [edx+1Ah],2
|
||||
jmp find_inexisting_offsets
|
||||
write_symbols:
|
||||
mov eax,[edx]
|
||||
jmp find_inexisting_offsets
|
||||
correct_inexisting_offset:
|
||||
and dword [edx],0
|
||||
or byte [edx+1Ah],2
|
||||
jmp find_inexisting_offsets
|
||||
write_symbols:
|
||||
mov edx,[symbols_file]
|
||||
call create
|
||||
jc write_failed
|
||||
mov edx,[code_start]
|
||||
mov ecx,[edx+14h]
|
||||
add ecx,38h
|
||||
call write
|
||||
jc write_failed
|
||||
mov edx,[display_buffer]
|
||||
jc write_failed
|
||||
mov edx,[code_start]
|
||||
mov ecx,[edx+14h]
|
||||
add ecx,40h
|
||||
call write
|
||||
jc write_failed
|
||||
mov edx,[display_buffer]
|
||||
mov ecx,[memory_end]
|
||||
sub ecx,[labels_list]
|
||||
call write
|
||||
@ -267,22 +281,53 @@ dump_symbols:
|
||||
jc write_failed
|
||||
mov edx,[free_additional_memory]
|
||||
mov ecx,[number_of_sections]
|
||||
shl ecx,2
|
||||
call write
|
||||
jc write_failed
|
||||
call close
|
||||
ret
|
||||
setup_dump_header:
|
||||
xor eax,eax
|
||||
mov ecx,38h shr 2
|
||||
rep stos dword [edi]
|
||||
mov ebx,edi
|
||||
mov dword [ebx-38h],'fas'+1Ah shl 24
|
||||
mov dword [ebx-38h+4],VERSION_MAJOR + VERSION_MINOR shl 8 + 38h shl 16
|
||||
mov dword [ebx-38h+10h],38h
|
||||
ret
|
||||
prepare_preprocessed_source:
|
||||
mov esi,[memory_start]
|
||||
shl ecx,2
|
||||
call write
|
||||
jc write_failed
|
||||
mov esi,[labels_list]
|
||||
mov edi,[memory_start]
|
||||
make_references_dump:
|
||||
cmp esi,[display_buffer]
|
||||
je references_dump_ok
|
||||
mov eax,[esi-4]
|
||||
mov ecx,[esi-8]
|
||||
sub esi,8
|
||||
sub esi,ecx
|
||||
cmp eax,2
|
||||
je dump_reference
|
||||
cmp eax,1
|
||||
jne make_references_dump
|
||||
mov edx,[esi]
|
||||
jmp make_references_dump
|
||||
dump_reference:
|
||||
mov eax,[memory_end]
|
||||
sub eax,[esi]
|
||||
sub eax,LABEL_STRUCTURE_SIZE
|
||||
stosd
|
||||
mov eax,edx
|
||||
stosd
|
||||
cmp edi,[display_buffer]
|
||||
jb make_references_dump
|
||||
jmp out_of_memory
|
||||
references_dump_ok:
|
||||
mov edx,[memory_start]
|
||||
mov ecx,edi
|
||||
sub ecx,edx
|
||||
call write
|
||||
jc write_failed
|
||||
call close
|
||||
ret
|
||||
setup_dump_header:
|
||||
xor eax,eax
|
||||
mov ecx,40h shr 2
|
||||
rep stos dword [edi]
|
||||
mov ebx,edi
|
||||
mov dword [ebx-40h],'fas'+1Ah shl 24
|
||||
mov dword [ebx-40h+4],VERSION_MAJOR + VERSION_MINOR shl 8 + 40h shl 16
|
||||
mov dword [ebx-40h+10h],40h
|
||||
ret
|
||||
prepare_preprocessed_source:
|
||||
mov esi,[memory_start]
|
||||
mov ebp,[source_start]
|
||||
test ebp,ebp
|
||||
jnz prepare_preprocessed_line
|
||||
@ -362,29 +407,29 @@ dump_preprocessed_source:
|
||||
call copy_asciiz
|
||||
cmp edi,[additional_memory_end]
|
||||
jae out_of_memory
|
||||
mov eax,edi
|
||||
sub eax,ebx
|
||||
dec eax
|
||||
mov [ebx-38h+0Ch],eax
|
||||
mov eax,edi
|
||||
sub eax,ebx
|
||||
mov [ebx-38h+14h],eax
|
||||
add eax,38h
|
||||
mov [ebx-38h+20h],eax
|
||||
call prepare_preprocessed_source
|
||||
sub esi,[memory_start]
|
||||
mov [ebx-38h+24h],esi
|
||||
mov edx,[symbols_file]
|
||||
call create
|
||||
jc write_failed
|
||||
mov edx,[free_additional_memory]
|
||||
mov ecx,[edx+14h]
|
||||
add ecx,38h
|
||||
call write
|
||||
jc write_failed
|
||||
mov edx,[memory_start]
|
||||
mov eax,edi
|
||||
sub eax,ebx
|
||||
dec eax
|
||||
mov [ebx-40h+0Ch],eax
|
||||
mov eax,edi
|
||||
sub eax,ebx
|
||||
mov [ebx-40h+14h],eax
|
||||
add eax,40h
|
||||
mov [ebx-40h+20h],eax
|
||||
call prepare_preprocessed_source
|
||||
sub esi,[memory_start]
|
||||
mov [ebx-40h+24h],esi
|
||||
mov edx,[symbols_file]
|
||||
call create
|
||||
jc write_failed
|
||||
mov edx,[free_additional_memory]
|
||||
mov ecx,[edx+14h]
|
||||
add ecx,40h
|
||||
call write
|
||||
jc write_failed
|
||||
mov edx,[memory_start]
|
||||
mov ecx,esi
|
||||
call write
|
||||
jc write_failed
|
||||
call close
|
||||
ret
|
||||
ret
|
File diff suppressed because it is too large
Load Diff
@ -117,12 +117,16 @@ jump_type db ?
|
||||
push_size db ?
|
||||
value_size db ?
|
||||
address_size db ?
|
||||
label_size db ?
|
||||
size_declared db ?
|
||||
|
||||
value_undefined db ?
|
||||
value_constant db ?
|
||||
value_type db ?
|
||||
value_sign db ?
|
||||
fp_sign db ?
|
||||
fp_format db ?
|
||||
address_sign db ?
|
||||
compare_type db ?
|
||||
logical_value_wrapping db ?
|
||||
next_pass_needed db ?
|
||||
@ -130,8 +134,11 @@ output_format db ?
|
||||
labels_type db ?
|
||||
code_type db ?
|
||||
virtual_data db ?
|
||||
org_origin_sign db ?
|
||||
adjustment_sign db ?
|
||||
|
||||
macro_status db ?
|
||||
default_argument_value db ?
|
||||
prefixed_instruction db ?
|
||||
formatter_symbols_allowed db ?
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
|
||||
; flat assembler version 1.69
|
||||
; flat assembler version 1.70
|
||||
; Copyright (c) 1999-2012, Tomasz Grysztar.
|
||||
; All rights reserved.
|
||||
;
|
||||
@ -33,7 +33,7 @@
|
||||
; cannot simply be copied and put under another distribution licence
|
||||
; (including the GNU Public Licence).
|
||||
|
||||
VERSION_STRING equ "1.69.36"
|
||||
VERSION_STRING equ "1.70.01"
|
||||
|
||||
VERSION_MAJOR = 1
|
||||
VERSION_MINOR = 69
|
||||
VERSION_MINOR = 70
|
||||
|
@ -76,10 +76,9 @@ int_instruction:
|
||||
cmp al,'('
|
||||
jne invalid_operand
|
||||
call get_byte_value
|
||||
cmp [next_pass_needed],0
|
||||
jne int_imm_ok
|
||||
test eax,eax
|
||||
js value_out_of_range
|
||||
jns int_imm_ok
|
||||
call recoverable_overflow
|
||||
int_imm_ok:
|
||||
mov ah,al
|
||||
mov al,0CDh
|
||||
@ -160,11 +159,7 @@ basic_instruction:
|
||||
jae long_immediate_not_encodable
|
||||
jmp basic_mem_imm_32bit_ok
|
||||
basic_mem_imm_nosize:
|
||||
cmp [error_line],0
|
||||
jne basic_mem_imm_8bit
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
basic_mem_imm_8bit:
|
||||
call get_byte_value
|
||||
mov byte [value],al
|
||||
@ -373,6 +368,14 @@ basic_instruction:
|
||||
add [base_code],5
|
||||
call store_instruction_code
|
||||
jmp basic_store_imm_32bit
|
||||
recoverable_unknown_size:
|
||||
cmp [error_line],0
|
||||
jne ignore_unknown_size
|
||||
push [current_line]
|
||||
pop [error_line]
|
||||
mov [error],operand_size_not_specified
|
||||
ignore_unknown_size:
|
||||
ret
|
||||
single_operand_instruction:
|
||||
mov [base_code],0F6h
|
||||
mov [postbyte_register],al
|
||||
@ -392,11 +395,7 @@ single_operand_instruction:
|
||||
inc [base_code]
|
||||
jmp instruction_ready
|
||||
single_mem_nosize:
|
||||
cmp [error_line],0
|
||||
jne single_mem_8bit
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
single_mem_8bit:
|
||||
jmp instruction_ready
|
||||
single_reg:
|
||||
@ -575,11 +574,7 @@ mov_instruction:
|
||||
call store_instruction_with_imm16
|
||||
jmp instruction_assembled
|
||||
mov_mem_imm_nosize:
|
||||
cmp [error_line],0
|
||||
jne mov_mem_imm_32bit
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
mov_mem_imm_32bit:
|
||||
call operand_32bit
|
||||
call get_dword_value
|
||||
@ -920,37 +915,6 @@ mov_instruction:
|
||||
cmp ah,8
|
||||
je mov_xrx_store
|
||||
jmp invalid_operand_size
|
||||
cmov_instruction:
|
||||
mov [base_code],0Fh
|
||||
mov [extended_code],al
|
||||
lods byte [esi]
|
||||
call get_size_operator
|
||||
cmp al,10h
|
||||
jne invalid_operand
|
||||
lods byte [esi]
|
||||
call convert_register
|
||||
mov [postbyte_register],al
|
||||
lods byte [esi]
|
||||
cmp al,','
|
||||
jne invalid_operand
|
||||
lods byte [esi]
|
||||
call get_size_operator
|
||||
cmp al,'['
|
||||
je cmov_reg_mem
|
||||
cmp al,10h
|
||||
jne invalid_operand
|
||||
cmov_reg_reg:
|
||||
lods byte [esi]
|
||||
call convert_register
|
||||
mov bl,al
|
||||
mov al,ah
|
||||
call operand_autodetect
|
||||
jmp nomem_instruction_ready
|
||||
cmov_reg_mem:
|
||||
call get_address
|
||||
mov al,[operand_size]
|
||||
call operand_autodetect
|
||||
jmp instruction_ready
|
||||
test_instruction:
|
||||
mov [base_code],84h
|
||||
lods byte [esi]
|
||||
@ -1020,11 +984,7 @@ test_instruction:
|
||||
call store_instruction_with_imm16
|
||||
jmp instruction_assembled
|
||||
test_mem_imm_nosize:
|
||||
cmp [error_line],0
|
||||
jne test_mem_imm_32bit
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
test_mem_imm_32bit:
|
||||
call operand_32bit
|
||||
call get_dword_value
|
||||
@ -1243,11 +1203,7 @@ push_instruction:
|
||||
je push_mem_32bit
|
||||
cmp ah,8
|
||||
je push_mem_64bit
|
||||
cmp [error_line],0
|
||||
jne push_mem_store
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
jmp push_mem_store
|
||||
push_mem_16bit:
|
||||
test ah,not 2
|
||||
@ -1509,11 +1465,7 @@ pop_instruction:
|
||||
je pop_mem_32bit
|
||||
cmp ah,8
|
||||
je pop_mem_64bit
|
||||
cmp [error_line],0
|
||||
jne pop_mem_store
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
jmp pop_mem_store
|
||||
pop_mem_16bit:
|
||||
test ah,not 2
|
||||
@ -1689,11 +1641,7 @@ inc_instruction:
|
||||
mov [postbyte_register],al
|
||||
jmp instruction_ready
|
||||
inc_mem_nosize:
|
||||
cmp [error_line],0
|
||||
jne inc_mem_8bit
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
inc_mem_8bit:
|
||||
mov al,0FEh
|
||||
xchg al,[base_code]
|
||||
@ -2028,11 +1976,7 @@ sh_instruction:
|
||||
mov [base_code],0D3h
|
||||
jmp instruction_ready
|
||||
sh_mem_cl_nosize:
|
||||
cmp [error_line],0
|
||||
jne sh_mem_cl_8bit
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
sh_mem_cl_8bit:
|
||||
mov [base_code],0D2h
|
||||
jmp instruction_ready
|
||||
@ -2059,11 +2003,7 @@ sh_instruction:
|
||||
mov [base_code],0D1h
|
||||
jmp instruction_ready
|
||||
sh_mem_imm_nosize:
|
||||
cmp [error_line],0
|
||||
jne sh_mem_imm_8bit
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
sh_mem_imm_8bit:
|
||||
cmp byte [value],1
|
||||
je sh_mem_1_8bit
|
||||
@ -2277,11 +2217,7 @@ movx_instruction:
|
||||
call operand_autodetect
|
||||
jmp instruction_ready
|
||||
movx_unknown_size:
|
||||
cmp [error_line],0
|
||||
jne movx_mem_store
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
jmp movx_mem_store
|
||||
movx_reg:
|
||||
lods byte [esi]
|
||||
@ -2400,11 +2336,7 @@ bt_instruction:
|
||||
call store_instruction_with_imm8
|
||||
jmp instruction_assembled
|
||||
bt_mem_imm_nosize:
|
||||
cmp [error_line],0
|
||||
jne bt_mem_imm_store
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
jmp bt_mem_imm_store
|
||||
bt_reg:
|
||||
lods byte [esi]
|
||||
@ -2457,6 +2389,16 @@ bt_instruction:
|
||||
bs_instruction:
|
||||
mov [extended_code],al
|
||||
mov [base_code],0Fh
|
||||
call get_reg_mem
|
||||
jc bs_reg_reg
|
||||
mov al,[operand_size]
|
||||
call operand_autodetect
|
||||
jmp instruction_ready
|
||||
bs_reg_reg:
|
||||
mov al,ah
|
||||
call operand_autodetect
|
||||
jmp nomem_instruction_ready
|
||||
get_reg_mem:
|
||||
lods byte [esi]
|
||||
call get_size_operator
|
||||
cmp al,10h
|
||||
@ -2470,20 +2412,19 @@ bs_instruction:
|
||||
lods byte [esi]
|
||||
call get_size_operator
|
||||
cmp al,10h
|
||||
je bs_reg_reg
|
||||
je get_reg_reg
|
||||
cmp al,'['
|
||||
jne invalid_argument
|
||||
call get_address
|
||||
mov al,[operand_size]
|
||||
call operand_autodetect
|
||||
jmp instruction_ready
|
||||
bs_reg_reg:
|
||||
clc
|
||||
ret
|
||||
get_reg_reg:
|
||||
lods byte [esi]
|
||||
call convert_register
|
||||
mov bl,al
|
||||
mov al,ah
|
||||
call operand_autodetect
|
||||
jmp nomem_instruction_ready
|
||||
stc
|
||||
ret
|
||||
|
||||
imul_instruction:
|
||||
mov [base_code],0F6h
|
||||
mov [postbyte_register],5
|
||||
@ -2503,11 +2444,7 @@ imul_instruction:
|
||||
inc [base_code]
|
||||
jmp instruction_ready
|
||||
imul_mem_nosize:
|
||||
cmp [error_line],0
|
||||
jne imul_mem_8bit
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
imul_mem_8bit:
|
||||
jmp instruction_ready
|
||||
imul_reg:
|
||||
@ -2892,11 +2829,7 @@ jmp_instruction:
|
||||
je jmp_mem_far
|
||||
cmp [jump_type],2
|
||||
je jmp_mem_near
|
||||
cmp [error_line],0
|
||||
jne jmp_mem_near
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
jmp_mem_near:
|
||||
cmp [code_type],16
|
||||
je jmp_mem_16bit
|
||||
@ -3007,6 +2940,10 @@ jmp_instruction:
|
||||
jmp_imm_32bit_store:
|
||||
mov edx,eax
|
||||
sub edx,3
|
||||
jno jmp_imm_32bit_ok
|
||||
cmp [code_type],64
|
||||
je relative_jump_out_of_range
|
||||
jmp_imm_32bit_ok:
|
||||
mov al,[base_code]
|
||||
stos byte [edi]
|
||||
mov eax,edx
|
||||
@ -3021,7 +2958,7 @@ jmp_instruction:
|
||||
mov ecx,edx
|
||||
cdq
|
||||
cmp edx,ecx
|
||||
jne value_out_of_range
|
||||
jne relative_jump_out_of_range
|
||||
call check_for_short_jump
|
||||
jnc jmp_imm_32bit_store
|
||||
jmp_short:
|
||||
@ -3202,7 +3139,7 @@ conditional_jump:
|
||||
mov ecx,edx
|
||||
cdq
|
||||
cmp edx,ecx
|
||||
jne value_out_of_range
|
||||
jne relative_jump_out_of_range
|
||||
call check_for_short_jump
|
||||
jnc conditional_jump_32bit_store
|
||||
conditional_jump_short:
|
||||
@ -3307,7 +3244,7 @@ loop_instruction:
|
||||
mov ecx,edx
|
||||
cdq
|
||||
cmp edx,ecx
|
||||
jne value_out_of_range
|
||||
jne relative_jump_out_of_range
|
||||
jmp make_loop_jump
|
||||
loop_jump_16bit:
|
||||
call get_address_word_value
|
||||
@ -3393,11 +3330,7 @@ movs_instruction:
|
||||
je simple_instruction_64bit
|
||||
or bl,bl
|
||||
jnz invalid_operand_size
|
||||
cmp [error_line],0
|
||||
jne simple_instruction
|
||||
mov ebx,[current_line]
|
||||
mov [error_line],ebx
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
jmp simple_instruction
|
||||
lods_instruction:
|
||||
lods byte [esi]
|
||||
@ -3935,11 +3868,7 @@ basic_fpu_instruction:
|
||||
je basic_fpu_mem_64bit
|
||||
or al,al
|
||||
jnz invalid_operand_size
|
||||
cmp [error_line],0
|
||||
jne basic_fpu_mem_32bit
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
basic_fpu_mem_32bit:
|
||||
jmp instruction_ready
|
||||
basic_fpu_mem_64bit:
|
||||
@ -4007,11 +3936,7 @@ fi_instruction:
|
||||
je fi_mem_32bit
|
||||
or al,al
|
||||
jnz invalid_operand_size
|
||||
cmp [error_line],0
|
||||
jne fi_mem_32bit
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
fi_mem_32bit:
|
||||
mov [base_code],0DAh
|
||||
jmp instruction_ready
|
||||
@ -4036,11 +3961,7 @@ fld_instruction:
|
||||
je fld_mem_80bit
|
||||
or al,al
|
||||
jnz invalid_operand_size
|
||||
cmp [error_line],0
|
||||
jne fld_mem_32bit
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
fld_mem_32bit:
|
||||
mov [base_code],0D9h
|
||||
jmp instruction_ready
|
||||
@ -4086,11 +4007,7 @@ fild_instruction:
|
||||
je fild_mem_64bit
|
||||
or al,al
|
||||
jnz invalid_operand_size
|
||||
cmp [error_line],0
|
||||
jne fild_mem_32bit
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
fild_mem_32bit:
|
||||
mov [base_code],0DBh
|
||||
jmp instruction_ready
|
||||
@ -5648,7 +5565,7 @@ pmovsxdq_instruction:
|
||||
jne invalid_operand
|
||||
call get_address
|
||||
cmp [operand_size],0
|
||||
je mmx_imm8
|
||||
je instruction_ready
|
||||
mov al,[mmx_size]
|
||||
cmp al,[operand_size]
|
||||
jne invalid_operand_size
|
||||
@ -5854,7 +5771,7 @@ movntdqa_instruction:
|
||||
mov [opcode_prefix],66h
|
||||
mov [base_code],0Fh
|
||||
mov [extended_code],38h
|
||||
mov [supplemental_code],2Ah
|
||||
mov [supplemental_code],al
|
||||
lods byte [esi]
|
||||
call get_size_operator
|
||||
cmp al,10h
|
||||
@ -5979,11 +5896,7 @@ crc32_instruction:
|
||||
crc32_reg32_mem_store:
|
||||
jmp instruction_ready
|
||||
crc32_unknown_size:
|
||||
cmp [error_line],0
|
||||
jne crc32_reg32_mem_store
|
||||
mov eax,[current_line]
|
||||
mov [error_line],eax
|
||||
mov [error],operand_size_not_specified
|
||||
call recoverable_unknown_size
|
||||
jmp crc32_reg32_mem_store
|
||||
crc32_reg32_reg:
|
||||
lods byte [esi]
|
||||
@ -6301,6 +6214,8 @@ rdrand_instruction:
|
||||
call operand_autodetect
|
||||
jmp nomem_instruction_ready
|
||||
rdfsbase_instruction:
|
||||
cmp [code_type],64
|
||||
jne illegal_instruction
|
||||
mov [opcode_prefix],0F3h
|
||||
mov [base_code],0Fh
|
||||
mov [extended_code],0AEh
|
||||
@ -6318,6 +6233,70 @@ rdfsbase_instruction:
|
||||
call operand_autodetect
|
||||
jmp nomem_instruction_ready
|
||||
|
||||
xabort_instruction:
|
||||
lods byte [esi]
|
||||
call get_size_operator
|
||||
cmp ah,1
|
||||
ja invalid_operand_size
|
||||
cmp al,'('
|
||||
jne invalid_operand
|
||||
call get_byte_value
|
||||
mov dl,al
|
||||
mov ax,0F8C6h
|
||||
stos word [edi]
|
||||
mov al,dl
|
||||
stos byte [edi]
|
||||
jmp instruction_assembled
|
||||
xbegin_instruction:
|
||||
lods byte [esi]
|
||||
cmp al,'('
|
||||
jne invalid_operand
|
||||
mov al,[code_type]
|
||||
cmp al,64
|
||||
je xbegin_64bit
|
||||
cmp al,32
|
||||
je xbegin_32bit
|
||||
xbegin_16bit:
|
||||
call get_address_word_value
|
||||
add edi,4
|
||||
call calculate_relative_offset
|
||||
sub edi,4
|
||||
shl eax,16
|
||||
mov ax,0F8C7h
|
||||
stos dword [edi]
|
||||
jmp instruction_assembled
|
||||
xbegin_32bit:
|
||||
call get_address_dword_value
|
||||
jmp xbegin_address_ok
|
||||
xbegin_64bit:
|
||||
call get_address_qword_value
|
||||
xbegin_address_ok:
|
||||
add edi,5
|
||||
call calculate_relative_offset
|
||||
sub edi,5
|
||||
mov edx,eax
|
||||
cwde
|
||||
cmp eax,edx
|
||||
jne xbegin_rel32
|
||||
mov al,66h
|
||||
stos byte [edi]
|
||||
mov eax,edx
|
||||
shl eax,16
|
||||
mov ax,0F8C7h
|
||||
stos dword [edi]
|
||||
jmp instruction_assembled
|
||||
xbegin_rel32:
|
||||
sub edx,1
|
||||
jno xbegin_rel32_ok
|
||||
cmp [code_type],64
|
||||
je relative_jump_out_of_range
|
||||
xbegin_rel32_ok:
|
||||
mov ax,0F8C7h
|
||||
stos word [edi]
|
||||
mov eax,edx
|
||||
stos dword [edi]
|
||||
jmp instruction_assembled
|
||||
|
||||
convert_register:
|
||||
mov ah,al
|
||||
shr ah,4
|
||||
@ -6456,11 +6435,7 @@ get_address:
|
||||
cdq
|
||||
cmp edx,[address_high]
|
||||
je address_high_ok
|
||||
cmp [error_line],0
|
||||
jne address_high_ok
|
||||
mov ebx,[current_line]
|
||||
mov [error_line],ebx
|
||||
mov [error],value_out_of_range
|
||||
call recoverable_overflow
|
||||
address_high_ok:
|
||||
mov edx,eax
|
||||
ror ecx,16
|
||||
@ -6559,7 +6534,7 @@ store_instruction_code:
|
||||
cmp [code_type],64
|
||||
jne invalid_operand
|
||||
test al,0B0h
|
||||
jnz prefix_conflict
|
||||
jnz disallowed_combination_of_registers
|
||||
stos byte [edi]
|
||||
rex_prefix_ok:
|
||||
mov al,[base_code]
|
||||
@ -6617,13 +6592,11 @@ store_instruction:
|
||||
test bx,8080h
|
||||
jz address_value_ok
|
||||
address_value_out_of_range:
|
||||
cmp [error_line],0
|
||||
jne address_value_ok
|
||||
mov edx,[current_line]
|
||||
mov [error_line],edx
|
||||
mov [error],value_out_of_range
|
||||
call recoverable_overflow
|
||||
address_value_ok:
|
||||
call store_segment_prefix_if_necessary
|
||||
test [vex_required],4
|
||||
jnz address_vsib
|
||||
or bx,bx
|
||||
jz address_immediate
|
||||
cmp bx,0F800h
|
||||
@ -6733,6 +6706,22 @@ store_instruction:
|
||||
or al,cl
|
||||
stos byte [edi]
|
||||
ret
|
||||
address_vsib:
|
||||
mov al,bl
|
||||
shr al,4
|
||||
cmp al,0Ch
|
||||
je vector_index_ok
|
||||
cmp al,0Dh
|
||||
jne invalid_address
|
||||
vector_index_ok:
|
||||
mov al,bh
|
||||
shr al,4
|
||||
cmp al,4
|
||||
je postbyte_32bit
|
||||
cmp [code_type],64
|
||||
je address_prefix_ok
|
||||
test al,al
|
||||
jnz invalid_address
|
||||
postbyte_32bit:
|
||||
call address_32bit_prefix
|
||||
jmp address_prefix_ok
|
||||
@ -6779,6 +6768,7 @@ store_instruction:
|
||||
or ah,bl
|
||||
and bh,111b
|
||||
or ah,bh
|
||||
sib_ready:
|
||||
test ch,44h
|
||||
jnz sib_address_32bit_value
|
||||
test ch,88h
|
||||
|
Loading…
Reference in New Issue
Block a user