forked from KolibriOS/kolibrios
tag for fasm 1.68
fasm 1.69.06 in trunk git-svn-id: svn://kolibrios.org@1189 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
40beda5783
commit
905b52e8ee
200
programs/develop/fasm/tags/1.68/WHATSNEW.TXT
Normal file
200
programs/develop/fasm/tags/1.68/WHATSNEW.TXT
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
|
||||||
|
Visit http://flatassembler.net/ for more information.
|
||||||
|
|
||||||
|
|
||||||
|
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.
|
2034
programs/develop/fasm/tags/1.68/assemble.inc
Normal file
2034
programs/develop/fasm/tags/1.68/assemble.inc
Normal file
File diff suppressed because it is too large
Load Diff
5
programs/develop/fasm/tags/1.68/build_en.bat
Normal file
5
programs/develop/fasm/tags/1.68/build_en.bat
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
@erase lang.inc
|
||||||
|
@echo lang fix en >lang.inc
|
||||||
|
@fasm fasm.asm fasm
|
||||||
|
@erase lang.inc
|
||||||
|
@pause
|
6
programs/develop/fasm/tags/1.68/build_ru.bat
Normal file
6
programs/develop/fasm/tags/1.68/build_ru.bat
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
@erase lang.inc
|
||||||
|
@echo lang fix ru >lang.inc
|
||||||
|
@fasm fasm.asm fasm
|
||||||
|
@erase lang.inc
|
||||||
|
@kpack fasm
|
||||||
|
@pause
|
174
programs/develop/fasm/tags/1.68/errors.inc
Normal file
174
programs/develop/fasm/tags/1.68/errors.inc
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
|
||||||
|
; flat assembler core
|
||||||
|
; Copyright (c) 1999-2009, Tomasz Grysztar.
|
||||||
|
; All rights reserved.
|
||||||
|
|
||||||
|
out_of_memory:
|
||||||
|
push _out_of_memory
|
||||||
|
jmp fatal_error
|
||||||
|
stack_overflow:
|
||||||
|
push _stack_overflow
|
||||||
|
jmp fatal_error
|
||||||
|
main_file_not_found:
|
||||||
|
push _main_file_not_found
|
||||||
|
jmp fatal_error
|
||||||
|
unexpected_end_of_file:
|
||||||
|
push _unexpected_end_of_file
|
||||||
|
jmp fatal_error
|
||||||
|
code_cannot_be_generated:
|
||||||
|
push _code_cannot_be_generated
|
||||||
|
jmp fatal_error
|
||||||
|
format_limitations_exceeded:
|
||||||
|
push _format_limitations_exceeded
|
||||||
|
jmp fatal_error
|
||||||
|
invalid_definition:
|
||||||
|
push _invalid_definition
|
||||||
|
jmp fatal_error
|
||||||
|
write_failed:
|
||||||
|
push _write_failed
|
||||||
|
jmp fatal_error
|
||||||
|
|
||||||
|
file_not_found:
|
||||||
|
push _file_not_found
|
||||||
|
jmp assembler_error
|
||||||
|
error_reading_file:
|
||||||
|
push _error_reading_file
|
||||||
|
jmp assembler_error
|
||||||
|
invalid_file_format:
|
||||||
|
push _invalid_file_format
|
||||||
|
jmp assembler_error
|
||||||
|
invalid_macro_arguments:
|
||||||
|
push _invalid_macro_arguments
|
||||||
|
jmp assembler_error
|
||||||
|
incomplete_macro:
|
||||||
|
push _incomplete_macro
|
||||||
|
jmp assembler_error
|
||||||
|
unexpected_characters:
|
||||||
|
push _unexpected_characters
|
||||||
|
jmp assembler_error
|
||||||
|
invalid_argument:
|
||||||
|
push _invalid_argument
|
||||||
|
jmp assembler_error
|
||||||
|
illegal_instruction:
|
||||||
|
push _illegal_instruction
|
||||||
|
jmp assembler_error
|
||||||
|
invalid_operand:
|
||||||
|
push _invalid_operand
|
||||||
|
jmp assembler_error
|
||||||
|
invalid_operand_size:
|
||||||
|
push _invalid_operand_size
|
||||||
|
jmp assembler_error
|
||||||
|
operand_size_not_specified:
|
||||||
|
push _operand_size_not_specified
|
||||||
|
jmp assembler_error
|
||||||
|
operand_sizes_do_not_match:
|
||||||
|
push _operand_sizes_do_not_match
|
||||||
|
jmp assembler_error
|
||||||
|
invalid_address_size:
|
||||||
|
push _invalid_address_size
|
||||||
|
jmp assembler_error
|
||||||
|
address_sizes_do_not_agree:
|
||||||
|
push _address_sizes_do_not_agree
|
||||||
|
jmp assembler_error
|
||||||
|
prefix_conflict:
|
||||||
|
push _prefix_conflict
|
||||||
|
jmp assembler_error
|
||||||
|
long_immediate_not_encodable:
|
||||||
|
push _long_immediate_not_encodable
|
||||||
|
jmp assembler_error
|
||||||
|
relative_jump_out_of_range:
|
||||||
|
push _relative_jump_out_of_range
|
||||||
|
jmp assembler_error
|
||||||
|
invalid_expression:
|
||||||
|
push _invalid_expression
|
||||||
|
jmp assembler_error
|
||||||
|
invalid_address:
|
||||||
|
push _invalid_address
|
||||||
|
jmp assembler_error
|
||||||
|
invalid_value:
|
||||||
|
push _invalid_value
|
||||||
|
jmp assembler_error
|
||||||
|
value_out_of_range:
|
||||||
|
push _value_out_of_range
|
||||||
|
jmp assembler_error
|
||||||
|
undefined_symbol:
|
||||||
|
mov edi,message
|
||||||
|
mov esi,_undefined_symbol
|
||||||
|
call copy_asciiz
|
||||||
|
push message
|
||||||
|
cmp [error_info],0
|
||||||
|
je assembler_error
|
||||||
|
mov byte [edi-1],20h
|
||||||
|
call write_quoted_symbol_name
|
||||||
|
jmp assembler_error
|
||||||
|
copy_asciiz:
|
||||||
|
lods byte [esi]
|
||||||
|
stos byte [edi]
|
||||||
|
test al,al
|
||||||
|
jnz copy_asciiz
|
||||||
|
ret
|
||||||
|
write_quoted_symbol_name:
|
||||||
|
mov al,27h
|
||||||
|
stosb
|
||||||
|
mov esi,[error_info]
|
||||||
|
movzx ecx,byte [esi-1]
|
||||||
|
rep movs byte [edi],[esi]
|
||||||
|
mov ax,27h
|
||||||
|
stosw
|
||||||
|
ret
|
||||||
|
symbol_out_of_scope:
|
||||||
|
mov edi,message
|
||||||
|
mov esi,_symbol_out_of_scope_1
|
||||||
|
call copy_asciiz
|
||||||
|
cmp [error_info],0
|
||||||
|
je finish_symbol_out_of_scope_message
|
||||||
|
mov byte [edi-1],20h
|
||||||
|
call write_quoted_symbol_name
|
||||||
|
finish_symbol_out_of_scope_message:
|
||||||
|
mov byte [edi-1],20h
|
||||||
|
mov esi,_symbol_out_of_scope_2
|
||||||
|
call copy_asciiz
|
||||||
|
push message
|
||||||
|
jmp assembler_error
|
||||||
|
invalid_use_of_symbol:
|
||||||
|
push _invalid_use_of_symbol
|
||||||
|
jmp assembler_error
|
||||||
|
name_too_long:
|
||||||
|
push _name_too_long
|
||||||
|
jmp assembler_error
|
||||||
|
invalid_name:
|
||||||
|
push _invalid_name
|
||||||
|
jmp assembler_error
|
||||||
|
reserved_word_used_as_symbol:
|
||||||
|
push _reserved_word_used_as_symbol
|
||||||
|
jmp assembler_error
|
||||||
|
symbol_already_defined:
|
||||||
|
push _symbol_already_defined
|
||||||
|
jmp assembler_error
|
||||||
|
missing_end_quote:
|
||||||
|
push _missing_end_quote
|
||||||
|
jmp assembler_error
|
||||||
|
missing_end_directive:
|
||||||
|
push _missing_end_directive
|
||||||
|
jmp assembler_error
|
||||||
|
unexpected_instruction:
|
||||||
|
push _unexpected_instruction
|
||||||
|
jmp assembler_error
|
||||||
|
extra_characters_on_line:
|
||||||
|
push _extra_characters_on_line
|
||||||
|
jmp assembler_error
|
||||||
|
section_not_aligned_enough:
|
||||||
|
push _section_not_aligned_enough
|
||||||
|
jmp assembler_error
|
||||||
|
setting_already_specified:
|
||||||
|
push _setting_already_specified
|
||||||
|
jmp assembler_error
|
||||||
|
data_already_defined:
|
||||||
|
push _data_already_defined
|
||||||
|
jmp assembler_error
|
||||||
|
too_many_repeats:
|
||||||
|
push _too_many_repeats
|
||||||
|
jmp assembler_error
|
||||||
|
invoked_error:
|
||||||
|
push _invoked_error
|
||||||
|
jmp assembler_error
|
2878
programs/develop/fasm/tags/1.68/expressi.inc
Normal file
2878
programs/develop/fasm/tags/1.68/expressi.inc
Normal file
File diff suppressed because it is too large
Load Diff
608
programs/develop/fasm/tags/1.68/fasm.asm
Normal file
608
programs/develop/fasm/tags/1.68/fasm.asm
Normal file
@ -0,0 +1,608 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; ;;
|
||||||
|
;; flat assembler source ;;
|
||||||
|
;; Copyright (c) 1999-2006, Tomasz Grysztar ;;
|
||||||
|
;; All rights reserved. ;;
|
||||||
|
;; ;;
|
||||||
|
;; Menuet port by VT ;;
|
||||||
|
;; ;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
NORMAL_MODE = 8
|
||||||
|
CONSOLE_MODE = 32
|
||||||
|
|
||||||
|
MAGIC1 = 6*(text.line_size-1)+14
|
||||||
|
MAX_PATH = 100
|
||||||
|
|
||||||
|
APP_MEMORY = 0x00800000
|
||||||
|
|
||||||
|
;; Menuet header
|
||||||
|
|
||||||
|
appname equ "flat assembler "
|
||||||
|
|
||||||
|
use32
|
||||||
|
|
||||||
|
org 0x0
|
||||||
|
db 'MENUET01' ; 8 byte id
|
||||||
|
dd 0x01 ; header version
|
||||||
|
dd START ; program start
|
||||||
|
dd program_end ; program image size
|
||||||
|
dd stacktop ; required amount of memory
|
||||||
|
dd stacktop ; stack
|
||||||
|
dd params,0x0 ; parameters,icon
|
||||||
|
|
||||||
|
include 'lang.inc'
|
||||||
|
include '..\..\..\macros.inc'
|
||||||
|
purge add,sub ; macros.inc does incorrect substitution
|
||||||
|
include 'fasm.inc'
|
||||||
|
|
||||||
|
center fix true
|
||||||
|
|
||||||
|
START: ; Start of execution
|
||||||
|
mov edi, fileinfos
|
||||||
|
mov ecx, (fileinfos_end-fileinfos)/4
|
||||||
|
or eax, -1
|
||||||
|
rep stosd
|
||||||
|
push 68
|
||||||
|
pop eax
|
||||||
|
push 11
|
||||||
|
pop ebx
|
||||||
|
mcall
|
||||||
|
|
||||||
|
cmp [params],0
|
||||||
|
jz red
|
||||||
|
|
||||||
|
mov ecx,10
|
||||||
|
mov eax,' '
|
||||||
|
mov edi,infile
|
||||||
|
push ecx
|
||||||
|
cld
|
||||||
|
rep stosd
|
||||||
|
mov ecx,[esp]
|
||||||
|
mov edi,outfile
|
||||||
|
rep stosd
|
||||||
|
pop ecx
|
||||||
|
mov edi,path
|
||||||
|
rep stosd
|
||||||
|
|
||||||
|
mov esi,params
|
||||||
|
; DEBUGF "params: %s\n",esi
|
||||||
|
mov edi,infile
|
||||||
|
call mov_param_str
|
||||||
|
; mov edi,infile
|
||||||
|
; DEBUGF " input: %s\n",edi
|
||||||
|
inc esi
|
||||||
|
mov edi,outfile
|
||||||
|
call mov_param_str
|
||||||
|
; mov edi,outfile
|
||||||
|
; DEBUGF "output: %s\n",edi
|
||||||
|
inc esi
|
||||||
|
mov edi,path
|
||||||
|
call mov_param_str
|
||||||
|
; mov edi,path
|
||||||
|
; DEBUGF " path: %s\n",edi
|
||||||
|
|
||||||
|
cmp [esi], dword ',run'
|
||||||
|
jne @f
|
||||||
|
mov [_run_outfile],1
|
||||||
|
@@:
|
||||||
|
|
||||||
|
mov [_mode],CONSOLE_MODE
|
||||||
|
jmp start
|
||||||
|
|
||||||
|
|
||||||
|
red: ; Redraw
|
||||||
|
call draw_window
|
||||||
|
|
||||||
|
still:
|
||||||
|
push 10 ; Wait here for event
|
||||||
|
pop eax
|
||||||
|
mcall
|
||||||
|
dec eax
|
||||||
|
je red ; Redraw request
|
||||||
|
dec eax
|
||||||
|
jne button ; Button in buffer
|
||||||
|
|
||||||
|
key: ; Key
|
||||||
|
mov al,2 ; Read it and ignore
|
||||||
|
mcall
|
||||||
|
jmp still
|
||||||
|
|
||||||
|
button: ; Button in Window
|
||||||
|
|
||||||
|
mov al,17
|
||||||
|
mcall
|
||||||
|
|
||||||
|
cmp ah,1
|
||||||
|
jne noclose
|
||||||
|
or eax,-1
|
||||||
|
mcall
|
||||||
|
|
||||||
|
noclose:
|
||||||
|
cmp ah,2 ; Start compiling
|
||||||
|
je start
|
||||||
|
cmp ah,3 ; Start compiled file
|
||||||
|
jnz norunout
|
||||||
|
|
||||||
|
mov edx,outfile
|
||||||
|
call make_fullpaths
|
||||||
|
mcall 70,file_info_start
|
||||||
|
; xor ecx,ecx
|
||||||
|
jmp still
|
||||||
|
norunout:
|
||||||
|
cmp ah,4
|
||||||
|
jnz norundebug
|
||||||
|
|
||||||
|
mov edx,outfile
|
||||||
|
call make_fullpaths
|
||||||
|
mcall 70,file_info_debug
|
||||||
|
jmp still
|
||||||
|
|
||||||
|
norundebug:
|
||||||
|
mov ecx,5
|
||||||
|
mov [ya],ecx
|
||||||
|
|
||||||
|
cmp ah,11 ; Infile
|
||||||
|
je f1
|
||||||
|
cmp ah,12 ; Outfile
|
||||||
|
je f2
|
||||||
|
cmp ah,13 ; Path
|
||||||
|
je f3
|
||||||
|
cmp ah,14
|
||||||
|
je f4
|
||||||
|
|
||||||
|
jmp still
|
||||||
|
|
||||||
|
f4:
|
||||||
|
xor [bGenerateDebugInfo], 1
|
||||||
|
mcall 8,,,0x8000000E
|
||||||
|
call draw_checkbox
|
||||||
|
jmp still
|
||||||
|
|
||||||
|
draw_window:
|
||||||
|
|
||||||
|
pusha
|
||||||
|
|
||||||
|
mcall 12,1 ; Start of draw
|
||||||
|
|
||||||
|
get_sys_colors 1,0
|
||||||
|
|
||||||
|
xor eax,eax
|
||||||
|
mov ebx,100*65536+280
|
||||||
|
mov ecx,90*65536+260
|
||||||
|
mov edx,[sc.work]
|
||||||
|
or edx,0x33000000
|
||||||
|
mov edi,title ; Draw Window Label Text
|
||||||
|
mcall
|
||||||
|
|
||||||
|
mcall 9,PROCESSINFO,-1
|
||||||
|
|
||||||
|
mpack ecx,1,1
|
||||||
|
mov ebx,[pinfo.box.width]
|
||||||
|
sub ebx,10
|
||||||
|
|
||||||
|
push ecx
|
||||||
|
madd ecx, 14*3+16+2, 14*3+16+2
|
||||||
|
mcall 38,,,[sc.work_graph]
|
||||||
|
pop ecx
|
||||||
|
|
||||||
|
sub ebx,MAGIC1+3
|
||||||
|
mcall
|
||||||
|
madd ecx, 14, 14
|
||||||
|
mcall
|
||||||
|
madd ecx, 14, 14
|
||||||
|
mcall
|
||||||
|
madd ecx, 14, 14
|
||||||
|
mcall
|
||||||
|
push ebx
|
||||||
|
mpack ebx,MAGIC1,MAGIC1
|
||||||
|
sub ecx, 14*3
|
||||||
|
mcall
|
||||||
|
mov ebx,[esp-2]
|
||||||
|
pop bx
|
||||||
|
mcall
|
||||||
|
add esp,2
|
||||||
|
|
||||||
|
mpack ebx,0,MAGIC1-1
|
||||||
|
mpack ecx,1+1, 14-2
|
||||||
|
mcall 8,,,0x4000000B ; Button: Enter Infile
|
||||||
|
madd ecx, 14,0
|
||||||
|
mcall ,,,0x4000000C ; Button: Enter Outfile
|
||||||
|
madd ecx, 14,0
|
||||||
|
mcall ,,,0x4000000D ; Button: Enter Path
|
||||||
|
|
||||||
|
mpack ebx,[pinfo.box.width],MAGIC1
|
||||||
|
msub ebx,MAGIC1+10+1,0
|
||||||
|
mpack ecx,0, (14*3+16)/3-1
|
||||||
|
madd ecx,1,0
|
||||||
|
mcall ,,,0x00000002,[sc.work_button]
|
||||||
|
madd ecx, (14*3+16)/3+1,0
|
||||||
|
mcall ,,,0x00000003
|
||||||
|
madd ecx, (14*3+16)/3+1,0
|
||||||
|
mcall ,,,4
|
||||||
|
|
||||||
|
mpack ebx,6,0 ; Draw Window Text
|
||||||
|
add ebx,1+ 14/2-3
|
||||||
|
mov ecx,[sc.work_text]
|
||||||
|
mov edx,text
|
||||||
|
mov esi,text.line_size
|
||||||
|
mov eax,4
|
||||||
|
newline:
|
||||||
|
mcall
|
||||||
|
add ebx, 14
|
||||||
|
add edx,text.line_size
|
||||||
|
cmp byte[edx],'x'
|
||||||
|
jne newline
|
||||||
|
|
||||||
|
mov ebx,[pinfo.box.width]
|
||||||
|
sub ebx,MAGIC1+10+1-9
|
||||||
|
shl ebx,16
|
||||||
|
add ebx,1+( (14*3+16)/3-1)/2-3
|
||||||
|
mcall ,,[sc.work_button_text],s_compile,7
|
||||||
|
add ebx,(14*3+16)/3+1
|
||||||
|
mcall ,,,s_run
|
||||||
|
add ebx,(14*3+16)/3+1
|
||||||
|
mcall ,,,s_debug
|
||||||
|
|
||||||
|
mpack ebx,MAGIC1+6,0
|
||||||
|
add ebx,1+ 14/2-3+ 14*0
|
||||||
|
mov esi,[pinfo.box.width]
|
||||||
|
sub esi,MAGIC1*2+5*2+6+3
|
||||||
|
mov eax,esi
|
||||||
|
mov cl,6
|
||||||
|
div cl
|
||||||
|
cmp al,MAX_PATH
|
||||||
|
jbe @f
|
||||||
|
mov al,MAX_PATH
|
||||||
|
@@: movzx esi,al
|
||||||
|
mcall 4,,[sc.work_text],infile
|
||||||
|
add ebx,14
|
||||||
|
mcall ,,,outfile
|
||||||
|
add ebx,14
|
||||||
|
mcall ,,,path
|
||||||
|
|
||||||
|
call draw_checkbox
|
||||||
|
|
||||||
|
call draw_messages
|
||||||
|
|
||||||
|
mcall 12,2 ; End of Draw
|
||||||
|
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
bottom_right dd ?
|
||||||
|
|
||||||
|
draw_checkbox:
|
||||||
|
mcall 8,<5,10>,<14*3+5,10>,14,[sc.work_button]
|
||||||
|
cmp [bGenerateDebugInfo], 0
|
||||||
|
jz @f
|
||||||
|
mov edx, [sc.work_button_text]
|
||||||
|
mcall 38,<7,13>,<14*3+7,14*3+13>
|
||||||
|
mcall 38,,<14*3+13,14*3+7>
|
||||||
|
@@:
|
||||||
|
mov ecx, [sc.work_text]
|
||||||
|
or ecx, 0x80000000
|
||||||
|
mcall 4,<20,14*3+7>,,s_dbgdescr
|
||||||
|
ret
|
||||||
|
|
||||||
|
draw_messages:
|
||||||
|
mov eax,13 ; clear work area
|
||||||
|
mpack ebx,7-2,[pinfo.box.width]
|
||||||
|
sub ebx,5*2+7*2-1-2*2
|
||||||
|
mpack ecx,0,[pinfo.box.height]
|
||||||
|
madd ecx, 14*3+16+1+7+1,-( 14*3+16+1+7*2+25)
|
||||||
|
mov word[bottom_right+2],bx
|
||||||
|
mov word[bottom_right],cx
|
||||||
|
msub [bottom_right],7,11
|
||||||
|
add [bottom_right],7 shl 16 + 53
|
||||||
|
mov edx,[sc.work]
|
||||||
|
mcall
|
||||||
|
_cy = 0
|
||||||
|
_sy = 2
|
||||||
|
_cx = 4
|
||||||
|
_sx = 6
|
||||||
|
push ebx ecx
|
||||||
|
mpack ebx,4,5
|
||||||
|
add bx,[esp+_cx]
|
||||||
|
mov ecx,[esp+_sy-2]
|
||||||
|
mov cx,[esp+_sy]
|
||||||
|
msub ecx,1,1
|
||||||
|
mcall 38,,,[sc.work_graph]
|
||||||
|
mov si,[esp+_cy]
|
||||||
|
add cx,si
|
||||||
|
shl esi,16
|
||||||
|
add ecx,esi
|
||||||
|
madd ecx,1,1
|
||||||
|
mcall
|
||||||
|
mpack ebx,4,4
|
||||||
|
mov esi,[esp+_sy-2]
|
||||||
|
mov si,cx
|
||||||
|
mov ecx,esi
|
||||||
|
mcall
|
||||||
|
mov si,[esp+_cx]
|
||||||
|
add bx,si
|
||||||
|
shl esi,16
|
||||||
|
add ebx,esi
|
||||||
|
madd ebx,1,1
|
||||||
|
mcall
|
||||||
|
pop ecx ebx
|
||||||
|
ret
|
||||||
|
|
||||||
|
; read string
|
||||||
|
|
||||||
|
f1: mov [addr],infile
|
||||||
|
add [ya], 14*0
|
||||||
|
jmp rk
|
||||||
|
f2: mov [addr],outfile
|
||||||
|
add [ya], 14*1
|
||||||
|
jmp rk
|
||||||
|
f3: mov [addr],path
|
||||||
|
add [ya], 14*2
|
||||||
|
rk:
|
||||||
|
|
||||||
|
mov edi,[addr]
|
||||||
|
mov al,0
|
||||||
|
mov ecx,MAX_PATH
|
||||||
|
add edi,ecx
|
||||||
|
dec edi
|
||||||
|
std
|
||||||
|
repe scasb
|
||||||
|
sub ecx,MAX_PATH
|
||||||
|
neg ecx
|
||||||
|
mov al,$1C ; ''
|
||||||
|
add edi,2
|
||||||
|
push edi
|
||||||
|
cld
|
||||||
|
rep stosb
|
||||||
|
call print_text
|
||||||
|
pop edi
|
||||||
|
f11:mcall 10
|
||||||
|
cmp eax,2
|
||||||
|
jne read_done
|
||||||
|
mcall; 2
|
||||||
|
shr eax,8
|
||||||
|
cmp al,13
|
||||||
|
je read_done
|
||||||
|
cmp al,8
|
||||||
|
jne nobs
|
||||||
|
cmp edi,[addr]
|
||||||
|
je f11
|
||||||
|
sub edi,1
|
||||||
|
mov byte[edi],$1C ; '_'
|
||||||
|
call print_text
|
||||||
|
jmp f11
|
||||||
|
nobs:
|
||||||
|
movzx ebx,al
|
||||||
|
sub ebx,$20
|
||||||
|
jle f11
|
||||||
|
sub al,[sub_table+ebx]
|
||||||
|
keyok:
|
||||||
|
mov ecx,[addr]
|
||||||
|
add ecx,MAX_PATH
|
||||||
|
cmp edi,ecx
|
||||||
|
jae f11
|
||||||
|
mov [edi],al
|
||||||
|
|
||||||
|
call print_text
|
||||||
|
inc edi
|
||||||
|
jmp f11
|
||||||
|
|
||||||
|
read_done:
|
||||||
|
|
||||||
|
mov ecx,[addr]
|
||||||
|
add ecx,MAX_PATH
|
||||||
|
sub ecx,edi
|
||||||
|
mov al,0;' '
|
||||||
|
cld
|
||||||
|
rep stosb
|
||||||
|
call print_text
|
||||||
|
|
||||||
|
jmp still
|
||||||
|
|
||||||
|
print_text:
|
||||||
|
|
||||||
|
mpack ebx,MAGIC1+6,[pinfo.box.width]
|
||||||
|
sub ebx,MAGIC1*2+19
|
||||||
|
movzx esi,bx
|
||||||
|
mov ecx,[ya-2]
|
||||||
|
mov cx,8
|
||||||
|
mcall 13,,,[sc.work]
|
||||||
|
|
||||||
|
mpack ebx,MAGIC1+6,[ya]
|
||||||
|
mov eax,esi
|
||||||
|
mov cl,6
|
||||||
|
div cl
|
||||||
|
cmp al,MAX_PATH
|
||||||
|
jbe @f
|
||||||
|
mov al,MAX_PATH
|
||||||
|
@@: movzx esi,al
|
||||||
|
mcall 4,,[sc.work_text],[addr]
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; DATA
|
||||||
|
|
||||||
|
text:
|
||||||
|
db ' INFILE:'
|
||||||
|
.line_size = $-text
|
||||||
|
db 'OUTFILE:'
|
||||||
|
db ' PATH:'
|
||||||
|
db 'x'
|
||||||
|
|
||||||
|
s_compile db 'COMPILE'
|
||||||
|
s_run db ' RUN '
|
||||||
|
s_debug db ' DEBUG '
|
||||||
|
|
||||||
|
s_dbgdescr db 'Generate debug information',0
|
||||||
|
|
||||||
|
infile db 'example.asm'
|
||||||
|
times MAX_PATH+$-infile db 0
|
||||||
|
outfile db 'example'
|
||||||
|
times MAX_PATH+$-outfile db 0
|
||||||
|
path db '/rd/1/'
|
||||||
|
times MAX_PATH+$-path db 0
|
||||||
|
|
||||||
|
lf db 13,10,0
|
||||||
|
|
||||||
|
addr dd 0x0
|
||||||
|
ya dd 0x0
|
||||||
|
zero db 0x0
|
||||||
|
|
||||||
|
mov_param_str:
|
||||||
|
@@:
|
||||||
|
mov al,[esi]
|
||||||
|
cmp al,','
|
||||||
|
je @f
|
||||||
|
cmp al,0
|
||||||
|
je @f
|
||||||
|
mov [edi],al
|
||||||
|
inc esi
|
||||||
|
inc edi
|
||||||
|
jmp @b
|
||||||
|
@@:
|
||||||
|
mov al,0
|
||||||
|
stosb
|
||||||
|
ret
|
||||||
|
|
||||||
|
start:
|
||||||
|
cmp [_mode],NORMAL_MODE
|
||||||
|
jne @f
|
||||||
|
call draw_messages
|
||||||
|
mov [textxy],7 shl 16 + 70
|
||||||
|
@@:
|
||||||
|
mov esi,_logo
|
||||||
|
call display_string
|
||||||
|
|
||||||
|
;
|
||||||
|
; Fasm native code
|
||||||
|
;
|
||||||
|
|
||||||
|
mov [input_file],infile
|
||||||
|
mov [output_file],outfile
|
||||||
|
|
||||||
|
call init_memory
|
||||||
|
|
||||||
|
call make_timestamp
|
||||||
|
mov [start_time],eax
|
||||||
|
|
||||||
|
call preprocessor
|
||||||
|
call parser
|
||||||
|
call assembler
|
||||||
|
cmp [bGenerateDebugInfo], 0
|
||||||
|
jz @f
|
||||||
|
call symbol_dump
|
||||||
|
@@:
|
||||||
|
call formatter
|
||||||
|
|
||||||
|
call display_user_messages
|
||||||
|
movzx eax,[current_pass]
|
||||||
|
inc eax
|
||||||
|
call display_number
|
||||||
|
mov esi,_passes_suffix
|
||||||
|
call display_string
|
||||||
|
call make_timestamp
|
||||||
|
sub eax,[start_time]
|
||||||
|
xor edx,edx
|
||||||
|
mov ebx,100
|
||||||
|
div ebx
|
||||||
|
or eax,eax
|
||||||
|
jz display_bytes_count
|
||||||
|
xor edx,edx
|
||||||
|
mov ebx,10
|
||||||
|
div ebx
|
||||||
|
push edx
|
||||||
|
call display_number
|
||||||
|
mov dl,'.'
|
||||||
|
call display_character
|
||||||
|
pop eax
|
||||||
|
call display_number
|
||||||
|
mov esi,_seconds_suffix
|
||||||
|
call display_string
|
||||||
|
display_bytes_count:
|
||||||
|
mov eax,[written_size]
|
||||||
|
call display_number
|
||||||
|
mov esi,_bytes_suffix
|
||||||
|
call display_string
|
||||||
|
xor al,al
|
||||||
|
|
||||||
|
cmp [_run_outfile],0
|
||||||
|
je @f
|
||||||
|
mov edx,outfile
|
||||||
|
call make_fullpaths
|
||||||
|
mov eax,70
|
||||||
|
mov ebx,file_info_start
|
||||||
|
xor ecx,ecx
|
||||||
|
mcall
|
||||||
|
@@:
|
||||||
|
jmp exit_program
|
||||||
|
|
||||||
|
|
||||||
|
include 'system.inc'
|
||||||
|
include 'version.inc'
|
||||||
|
include 'errors.inc'
|
||||||
|
include 'expressi.inc'
|
||||||
|
include 'preproce.inc'
|
||||||
|
include 'parser.inc'
|
||||||
|
include 'assemble.inc'
|
||||||
|
include 'formats.inc'
|
||||||
|
include 'x86_64.inc'
|
||||||
|
include 'tables.inc'
|
||||||
|
include 'symbdump.inc'
|
||||||
|
include 'messages.inc'
|
||||||
|
|
||||||
|
title db appname,VERSION_STRING,0
|
||||||
|
|
||||||
|
_logo db 'flat assembler version ',VERSION_STRING,13,10,0
|
||||||
|
|
||||||
|
_passes_suffix db ' passes, ',0
|
||||||
|
_seconds_suffix db ' seconds, ',0
|
||||||
|
_bytes_suffix db ' bytes.',13,10,0
|
||||||
|
|
||||||
|
_include db 'INCLUDE',0
|
||||||
|
|
||||||
|
_counter db 4,'0000'
|
||||||
|
|
||||||
|
_mode dd NORMAL_MODE
|
||||||
|
_run_outfile dd 0
|
||||||
|
bGenerateDebugInfo db 0
|
||||||
|
|
||||||
|
sub_table:
|
||||||
|
times $41 db $00
|
||||||
|
times $1A db $20
|
||||||
|
times $25 db $00
|
||||||
|
times $10 db $20
|
||||||
|
times $30 db $00
|
||||||
|
times $10 db $50
|
||||||
|
times $04 db $00,$01
|
||||||
|
times $08 db $00
|
||||||
|
|
||||||
|
;include_debug_strings
|
||||||
|
|
||||||
|
params db 0 ; 'TINYPAD.ASM,TINYPAD,/HD/1/TPAD4/',
|
||||||
|
program_end:
|
||||||
|
rb 1000h
|
||||||
|
|
||||||
|
align 4
|
||||||
|
|
||||||
|
include 'variable.inc'
|
||||||
|
|
||||||
|
program_base dd ?
|
||||||
|
buffer_address dd ?
|
||||||
|
memory_setting dd ?
|
||||||
|
start_time dd ?
|
||||||
|
memblock dd ?
|
||||||
|
|
||||||
|
predefinitions rb 1000h
|
||||||
|
|
||||||
|
dbgfilename rb MAX_PATH+4
|
||||||
|
|
||||||
|
sc system_colors
|
||||||
|
max_handles = 8
|
||||||
|
fileinfos rb (4+20+MAX_PATH)*max_handles
|
||||||
|
fileinfos_end:
|
||||||
|
pinfo process_information
|
||||||
|
|
||||||
|
align 1000h
|
||||||
|
rb 1000h
|
||||||
|
stacktop:
|
53
programs/develop/fasm/tags/1.68/fasm.inc
Normal file
53
programs/develop/fasm/tags/1.68/fasm.inc
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
center fix false
|
||||||
|
SYSTEMCOLORS fix sc
|
||||||
|
PROCESSINFO fix pinfo
|
||||||
|
|
||||||
|
macro get_sys_colors wnd_skin,font_1 {
|
||||||
|
mcall 48,3,SYSTEMCOLORS,sizeof.system_colors
|
||||||
|
if wnd_skin <> 0
|
||||||
|
or [SYSTEMCOLORS+system_colors.work],0x03000000
|
||||||
|
end if
|
||||||
|
if font_1 <> 0
|
||||||
|
or [SYSTEMCOLORS+system_colors.grab_text],0x10000000
|
||||||
|
end if
|
||||||
|
}
|
||||||
|
|
||||||
|
macro draw_caption _edx,_esi {
|
||||||
|
mov edx,_edx
|
||||||
|
mov esi,_esi
|
||||||
|
call __draw_caption
|
||||||
|
}
|
||||||
|
|
||||||
|
macro mmov reg,a1,a2 {
|
||||||
|
mov reg,(a1) shl 16 + (a2)
|
||||||
|
}
|
||||||
|
|
||||||
|
macro madd reg,a1,a2 {
|
||||||
|
add reg,(a1) shl 16 + (a2)
|
||||||
|
}
|
||||||
|
|
||||||
|
macro msub reg,a1,a2 {
|
||||||
|
sub reg,(a1) shl 16 + (a2)
|
||||||
|
}
|
||||||
|
|
||||||
|
macro jmpe reg,def,[val,lab] {
|
||||||
|
forward
|
||||||
|
cmp reg,val
|
||||||
|
je lab
|
||||||
|
common
|
||||||
|
if ~def eq
|
||||||
|
jmp def
|
||||||
|
end if
|
||||||
|
}
|
||||||
|
|
||||||
|
macro func name {
|
||||||
|
if used name
|
||||||
|
name:
|
||||||
|
}
|
||||||
|
|
||||||
|
macro endf {
|
||||||
|
end if
|
||||||
|
}
|
||||||
|
|
||||||
|
@^ fix macro comment {
|
||||||
|
^@ fix }
|
4250
programs/develop/fasm/tags/1.68/formats.inc
Normal file
4250
programs/develop/fasm/tags/1.68/formats.inc
Normal file
File diff suppressed because it is too large
Load Diff
51
programs/develop/fasm/tags/1.68/messages.inc
Normal file
51
programs/develop/fasm/tags/1.68/messages.inc
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
; flat assembler core
|
||||||
|
; Copyright (c) 1999-2009, 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
|
||||||
|
_code_cannot_be_generated db 'code cannot be generated',0
|
||||||
|
_format_limitations_exceeded db 'format limitations exceeded',0
|
||||||
|
_invalid_definition db 'invalid definition provided',0
|
||||||
|
_write_failed db 'write failed',0
|
||||||
|
_file_not_found db 'file not found',0
|
||||||
|
_error_reading_file db 'error reading file',0
|
||||||
|
_invalid_file_format db 'invalid file format',0
|
||||||
|
_invalid_macro_arguments db 'invalid macro arguments',0
|
||||||
|
_incomplete_macro db 'incomplete macro',0
|
||||||
|
_unexpected_characters db 'unexpected characters',0
|
||||||
|
_invalid_argument db 'invalid argument',0
|
||||||
|
_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
|
||||||
|
_invalid_address db 'invalid address',0
|
||||||
|
_invalid_value db 'invalid value',0
|
||||||
|
_value_out_of_range db 'value out of range',0
|
||||||
|
_undefined_symbol db 'undefined symbol',0
|
||||||
|
_symbol_out_of_scope_1 db 'symbol',0
|
||||||
|
_symbol_out_of_scope_2 db 'out of scope',0
|
||||||
|
_invalid_use_of_symbol db 'invalid use of symbol',0
|
||||||
|
_name_too_long db 'name too long',0
|
||||||
|
_invalid_name db 'invalid name',0
|
||||||
|
_reserved_word_used_as_symbol db 'reserved word used as symbol',0
|
||||||
|
_symbol_already_defined db 'symbol already defined',0
|
||||||
|
_missing_end_quote db 'missing end quote',0
|
||||||
|
_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
|
1350
programs/develop/fasm/tags/1.68/parser.inc
Normal file
1350
programs/develop/fasm/tags/1.68/parser.inc
Normal file
File diff suppressed because it is too large
Load Diff
2529
programs/develop/fasm/tags/1.68/preproce.inc
Normal file
2529
programs/develop/fasm/tags/1.68/preproce.inc
Normal file
File diff suppressed because it is too large
Load Diff
180
programs/develop/fasm/tags/1.68/struct.inc
Normal file
180
programs/develop/fasm/tags/1.68/struct.inc
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
|
||||||
|
; Macroinstructions for defining data structures
|
||||||
|
|
||||||
|
macro struct name
|
||||||
|
{ fields@struct equ name
|
||||||
|
match child parent, name \{ fields@struct equ child,fields@\#parent \}
|
||||||
|
sub@struct equ
|
||||||
|
struc db [val] \{ \common fields@struct equ fields@struct,.,db,<val> \}
|
||||||
|
struc dw [val] \{ \common fields@struct equ fields@struct,.,dw,<val> \}
|
||||||
|
struc du [val] \{ \common fields@struct equ fields@struct,.,du,<val> \}
|
||||||
|
struc dd [val] \{ \common fields@struct equ fields@struct,.,dd,<val> \}
|
||||||
|
struc dp [val] \{ \common fields@struct equ fields@struct,.,dp,<val> \}
|
||||||
|
struc dq [val] \{ \common fields@struct equ fields@struct,.,dq,<val> \}
|
||||||
|
struc dt [val] \{ \common fields@struct equ fields@struct,.,dt,<val> \}
|
||||||
|
struc rb count \{ fields@struct equ fields@struct,.,db,count dup (?) \}
|
||||||
|
struc rw count \{ fields@struct equ fields@struct,.,dw,count dup (?) \}
|
||||||
|
struc rd count \{ fields@struct equ fields@struct,.,dd,count dup (?) \}
|
||||||
|
struc rp count \{ fields@struct equ fields@struct,.,dp,count dup (?) \}
|
||||||
|
struc rq count \{ fields@struct equ fields@struct,.,dq,count dup (?) \}
|
||||||
|
struc rt count \{ fields@struct equ fields@struct,.,dt,count dup (?) \}
|
||||||
|
macro db [val] \{ \common \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,db,<val> \}
|
||||||
|
macro dw [val] \{ \common \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,dw,<val> \}
|
||||||
|
macro du [val] \{ \common \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,du,<val> \}
|
||||||
|
macro dd [val] \{ \common \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,dd,<val> \}
|
||||||
|
macro dp [val] \{ \common \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,dp,<val> \}
|
||||||
|
macro dq [val] \{ \common \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,dq,<val> \}
|
||||||
|
macro dt [val] \{ \common \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,dt,<val> \}
|
||||||
|
macro rb count \{ \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,db,count dup (?) \}
|
||||||
|
macro rw count \{ \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,dw,count dup (?) \}
|
||||||
|
macro rd count \{ \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,dd,count dup (?) \}
|
||||||
|
macro rp count \{ \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,dp,count dup (?) \}
|
||||||
|
macro rq count \{ \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,dq,count dup (?) \}
|
||||||
|
macro rt count \{ \local anonymous
|
||||||
|
fields@struct equ fields@struct,anonymous,dt,count dup (?) \}
|
||||||
|
macro union \{ fields@struct equ fields@struct,,union,<
|
||||||
|
sub@struct equ union \}
|
||||||
|
macro struct \{ fields@struct equ fields@struct,,substruct,<
|
||||||
|
sub@struct equ substruct \}
|
||||||
|
virtual at 0 }
|
||||||
|
|
||||||
|
macro ends
|
||||||
|
{ match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt
|
||||||
|
restruc rb,rw,rd,rp,rq,rt
|
||||||
|
purge db,dw,du,dd,dp,dq,dt
|
||||||
|
purge rb,rw,rd,rp,rq,rt
|
||||||
|
purge union,struct
|
||||||
|
match name=,fields,fields@struct \\{ fields@struct equ
|
||||||
|
make@struct name,fields
|
||||||
|
fields@\\#name equ fields \\}
|
||||||
|
end virtual \}
|
||||||
|
match any, sub@struct \{ fields@struct equ fields@struct> \}
|
||||||
|
restore sub@struct }
|
||||||
|
|
||||||
|
macro make@struct name,[field,type,def]
|
||||||
|
{ common
|
||||||
|
if $
|
||||||
|
display 'Error: definition of ',`name,' contains illegal instructions.',0Dh,0Ah
|
||||||
|
err
|
||||||
|
end if
|
||||||
|
local define
|
||||||
|
define equ name
|
||||||
|
forward
|
||||||
|
local sub
|
||||||
|
match , field \{ make@substruct type,name,sub def
|
||||||
|
define equ define,.,sub, \}
|
||||||
|
match any, field \{ define equ define,.#field,type,<def> \}
|
||||||
|
common
|
||||||
|
match fields, define \{ define@struct fields \} }
|
||||||
|
|
||||||
|
macro define@struct name,[field,type,def]
|
||||||
|
{ common
|
||||||
|
local list
|
||||||
|
list equ
|
||||||
|
forward
|
||||||
|
if ~ field eq .
|
||||||
|
name#field type def
|
||||||
|
sizeof.#name#field = $ - name#field
|
||||||
|
else
|
||||||
|
rb sizeof.#type
|
||||||
|
end if
|
||||||
|
local value
|
||||||
|
match any, list \{ list equ list, \}
|
||||||
|
list equ list <value>
|
||||||
|
common
|
||||||
|
sizeof.#name = $
|
||||||
|
restruc name
|
||||||
|
match values, list \{
|
||||||
|
struc name value \\{
|
||||||
|
match any, fields@struct \\\{ fields@struct equ fields@struct,.,name,<values> \\\}
|
||||||
|
match , fields@struct \\\{ label .
|
||||||
|
forward
|
||||||
|
match , value \\\\{ field type def \\\\}
|
||||||
|
match any, value \\\\{ field type value
|
||||||
|
if ~ field eq .
|
||||||
|
rb sizeof.#name#field - ($-field)
|
||||||
|
end if \\\\}
|
||||||
|
common \\\} \\} \} }
|
||||||
|
|
||||||
|
macro enable@substruct
|
||||||
|
{ macro make@substruct substruct,parent,name,[field,type,def]
|
||||||
|
\{ \common
|
||||||
|
\local define
|
||||||
|
define equ parent,name
|
||||||
|
\forward
|
||||||
|
\local sub
|
||||||
|
match , field \\{ match any, type \\\{ enable@substruct
|
||||||
|
make@substruct type,name,sub def
|
||||||
|
purge make@substruct
|
||||||
|
define equ define,.,sub, \\\} \\}
|
||||||
|
match any, field \\{ define equ define,.\#field,type,<def> \\}
|
||||||
|
\common
|
||||||
|
match fields, define \\{ define@\#substruct fields \\} \} }
|
||||||
|
|
||||||
|
enable@substruct
|
||||||
|
|
||||||
|
macro define@union parent,name,[field,type,def]
|
||||||
|
{ common
|
||||||
|
virtual at 0
|
||||||
|
forward
|
||||||
|
if ~ field eq .
|
||||||
|
virtual at 0
|
||||||
|
parent#field type def
|
||||||
|
sizeof.#parent#field = $ - parent#field
|
||||||
|
end virtual
|
||||||
|
if sizeof.#parent#field > $
|
||||||
|
rb sizeof.#parent#field - $
|
||||||
|
end if
|
||||||
|
else if sizeof.#type > $
|
||||||
|
rb sizeof.#type - $
|
||||||
|
end if
|
||||||
|
common
|
||||||
|
sizeof.#name = $
|
||||||
|
end virtual
|
||||||
|
struc name [value] \{ \common
|
||||||
|
label .\#name
|
||||||
|
last@union equ
|
||||||
|
forward
|
||||||
|
match any, last@union \\{ virtual at .\#name
|
||||||
|
field type def
|
||||||
|
end virtual \\}
|
||||||
|
match , last@union \\{ match , value \\\{ field type def \\\}
|
||||||
|
match any, value \\\{ field type value \\\} \\}
|
||||||
|
last@union equ field
|
||||||
|
common rb sizeof.#name - ($ - .\#name) \} }
|
||||||
|
|
||||||
|
macro define@substruct parent,name,[field,type,def]
|
||||||
|
{ common
|
||||||
|
virtual at 0
|
||||||
|
forward
|
||||||
|
if ~ field eq .
|
||||||
|
parent#field type def
|
||||||
|
sizeof.#parent#field = $ - parent#field
|
||||||
|
else
|
||||||
|
rb sizeof.#type
|
||||||
|
end if
|
||||||
|
local value
|
||||||
|
common
|
||||||
|
sizeof.#name = $
|
||||||
|
end virtual
|
||||||
|
struc name value \{
|
||||||
|
label .\#name
|
||||||
|
forward
|
||||||
|
match , value \\{ field type def \\}
|
||||||
|
match any, value \\{ field type value
|
||||||
|
if ~ field eq .
|
||||||
|
rb sizeof.#parent#field - ($-field)
|
||||||
|
end if \\}
|
||||||
|
common \} }
|
110
programs/develop/fasm/tags/1.68/symbdump.inc
Normal file
110
programs/develop/fasm/tags/1.68/symbdump.inc
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
symbol_dump:
|
||||||
|
|
||||||
|
push edi
|
||||||
|
mov edx,[memory_end]
|
||||||
|
symb_dump:
|
||||||
|
cmp edx,[labels_list]
|
||||||
|
jbe symbols_dumped
|
||||||
|
sub edx,LABEL_STRUCTURE_SIZE
|
||||||
|
cmp dword [edx+24],0
|
||||||
|
je symb_dump ; do not dump anonymous symbols
|
||||||
|
test byte [edx+8],1
|
||||||
|
jz symb_dump ; do not dump symbols that didn't get defined
|
||||||
|
mov ax,[current_pass]
|
||||||
|
cmp ax,[edx+16]
|
||||||
|
jne symb_dump
|
||||||
|
test byte [edx+8],4 or 2
|
||||||
|
jnz symb_dump ; do not dump assembly-time variables
|
||||||
|
; do not dump variables defined with '='
|
||||||
|
cmp word [edx+12], 0
|
||||||
|
jnz symb_dump ; do not dump register-based variables
|
||||||
|
|
||||||
|
mov al, '0'
|
||||||
|
stosb
|
||||||
|
mov al, 'x'
|
||||||
|
stosb
|
||||||
|
mov eax, [edx+4]
|
||||||
|
mov ecx, 8
|
||||||
|
@@:
|
||||||
|
rol eax, 4
|
||||||
|
test al, 0xF
|
||||||
|
loopz @b
|
||||||
|
jz .nohigh
|
||||||
|
inc ecx
|
||||||
|
@@:
|
||||||
|
push eax
|
||||||
|
and al, 0xF
|
||||||
|
cmp al, 10
|
||||||
|
sbb al, 69h
|
||||||
|
das
|
||||||
|
stosb
|
||||||
|
pop eax
|
||||||
|
rol eax, 4
|
||||||
|
loop @b
|
||||||
|
mov eax, [edx]
|
||||||
|
mov ecx, 8
|
||||||
|
jmp .low
|
||||||
|
.nohigh:
|
||||||
|
mov eax, [edx]
|
||||||
|
mov ecx, 8
|
||||||
|
@@:
|
||||||
|
rol eax, 4
|
||||||
|
test al, 0xF
|
||||||
|
loopz @b
|
||||||
|
inc ecx
|
||||||
|
.low:
|
||||||
|
push eax
|
||||||
|
and al, 0xF
|
||||||
|
cmp al, 10
|
||||||
|
sbb al, 69h
|
||||||
|
das
|
||||||
|
stosb
|
||||||
|
pop eax
|
||||||
|
rol eax, 4
|
||||||
|
loop .low
|
||||||
|
|
||||||
|
mov al, ' '
|
||||||
|
stosb
|
||||||
|
|
||||||
|
mov esi,[edx+24]
|
||||||
|
movzx ecx,byte [esi-1]
|
||||||
|
rep movsb
|
||||||
|
|
||||||
|
mov ax,0A0Dh
|
||||||
|
stosw
|
||||||
|
|
||||||
|
jmp symb_dump
|
||||||
|
|
||||||
|
symbols_dumped:
|
||||||
|
mov edx,dbgfilename
|
||||||
|
push esi edi
|
||||||
|
mov esi, outfile
|
||||||
|
mov edi, edx
|
||||||
|
@@:
|
||||||
|
lodsb
|
||||||
|
stosb
|
||||||
|
test al, al
|
||||||
|
jnz @b
|
||||||
|
lea ecx, [edi-1]
|
||||||
|
@@:
|
||||||
|
dec edi
|
||||||
|
cmp edi, edx
|
||||||
|
jb @f
|
||||||
|
cmp byte [edi], '/'
|
||||||
|
jz @f
|
||||||
|
cmp byte [edi], '.'
|
||||||
|
jnz @b
|
||||||
|
mov ecx, edi
|
||||||
|
@@:
|
||||||
|
mov dword [ecx], '.dbg'
|
||||||
|
mov byte [ecx+4], 0
|
||||||
|
pop edi esi
|
||||||
|
call create
|
||||||
|
mov edx,[esp]
|
||||||
|
mov ecx,edi
|
||||||
|
sub ecx,edx
|
||||||
|
call write
|
||||||
|
call close
|
||||||
|
pop edi
|
||||||
|
|
||||||
|
ret
|
573
programs/develop/fasm/tags/1.68/system.inc
Normal file
573
programs/develop/fasm/tags/1.68/system.inc
Normal file
@ -0,0 +1,573 @@
|
|||||||
|
; flat assembler
|
||||||
|
; Copyright (c) 1999-2007, Tomasz Grysztar
|
||||||
|
; All rights reserved.
|
||||||
|
|
||||||
|
struc FILEIO
|
||||||
|
{ .cmd dd ?
|
||||||
|
.offset dd ?
|
||||||
|
dd ?
|
||||||
|
.count dd ?
|
||||||
|
.buff dd ?
|
||||||
|
db ?
|
||||||
|
.name dd ?
|
||||||
|
};
|
||||||
|
|
||||||
|
struc FILEINFO
|
||||||
|
{ .attr dd ?
|
||||||
|
.flags dd ?
|
||||||
|
.cr_time dd ?
|
||||||
|
.cr_date dd ?
|
||||||
|
.acc_time dd ?
|
||||||
|
.acc_date dd ?
|
||||||
|
.mod_time dd ?
|
||||||
|
.mod_date dd ?
|
||||||
|
.size dd ?
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;file_info_open: dd 0,0,0xffffff,0x20000,0xf0000
|
||||||
|
fullpath_open: ; db '/RD/1/EXAMPLE.ASM'
|
||||||
|
times MAX_PATH db 0
|
||||||
|
|
||||||
|
|
||||||
|
;file_info_write: dd 1,0,0,0,0xf0000
|
||||||
|
fullpath_write:; db '/RD/1/EXAMPLE'
|
||||||
|
times MAX_PATH db 0
|
||||||
|
|
||||||
|
file_info_start:
|
||||||
|
dd 7
|
||||||
|
dd 0
|
||||||
|
dd 0
|
||||||
|
dd 0
|
||||||
|
dd 0
|
||||||
|
fullpath_start: ; db '/RD/1/EXAMPLE'
|
||||||
|
times MAX_PATH db 0
|
||||||
|
|
||||||
|
file_info_debug:
|
||||||
|
dd 7
|
||||||
|
dd 0
|
||||||
|
dd fullpath_start
|
||||||
|
dd 0, 0
|
||||||
|
db '/SYS/DEVELOP/MTDBG',0
|
||||||
|
|
||||||
|
_ramdisk db '/RD/1/'
|
||||||
|
filepos dd 0x0
|
||||||
|
|
||||||
|
|
||||||
|
init_memory:
|
||||||
|
|
||||||
|
mov ecx, 16*1024*1024
|
||||||
|
|
||||||
|
allocate_memory:
|
||||||
|
mov [memory_setting],ecx
|
||||||
|
mcall 68, 12
|
||||||
|
or eax,eax
|
||||||
|
jz out_of_memory
|
||||||
|
mov [additional_memory],eax
|
||||||
|
add eax,[memory_setting]
|
||||||
|
mov [memory_end],eax
|
||||||
|
mov eax,[memory_setting]
|
||||||
|
shr eax,2
|
||||||
|
add eax,[additional_memory]
|
||||||
|
mov [additional_memory_end],eax
|
||||||
|
mov [memory_start],eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
exit_program:
|
||||||
|
cmp [_mode],NORMAL_MODE
|
||||||
|
jne @f
|
||||||
|
mcall 68, 13, [memblock]
|
||||||
|
jmp still
|
||||||
|
@@:
|
||||||
|
or eax,-1
|
||||||
|
mcall
|
||||||
|
|
||||||
|
make_timestamp:
|
||||||
|
push ebx
|
||||||
|
mcall 26,9
|
||||||
|
imul eax,10
|
||||||
|
pop ebx
|
||||||
|
ret
|
||||||
|
|
||||||
|
get_environment_variable:
|
||||||
|
mov ecx,[memory_end]
|
||||||
|
sub ecx,edi
|
||||||
|
cmp ecx,7
|
||||||
|
jb out_of_memory
|
||||||
|
cmp dword[esi],'INCL'
|
||||||
|
jne .finish
|
||||||
|
mov esi,_ramdisk
|
||||||
|
mov ecx,6
|
||||||
|
cld
|
||||||
|
rep movsb
|
||||||
|
.finish:
|
||||||
|
; stc
|
||||||
|
ret
|
||||||
|
|
||||||
|
alloc_handle:
|
||||||
|
call make_fullpaths
|
||||||
|
mov ebx, fileinfos+4
|
||||||
|
@@:
|
||||||
|
cmp dword [ebx], -1
|
||||||
|
jz .found
|
||||||
|
add ebx, 4+20+MAX_PATH
|
||||||
|
cmp ebx, fileinfos_end
|
||||||
|
jb @b
|
||||||
|
stc
|
||||||
|
ret
|
||||||
|
.found:
|
||||||
|
and dword [ebx+4], 0
|
||||||
|
and dword [ebx+8], 0
|
||||||
|
push esi edi ecx
|
||||||
|
mov esi, fullpath_open
|
||||||
|
lea edi, [ebx+20]
|
||||||
|
mov ecx, MAX_PATH
|
||||||
|
rep movsb
|
||||||
|
pop ecx edi esi
|
||||||
|
ret ; CF=0
|
||||||
|
|
||||||
|
create:
|
||||||
|
call alloc_handle
|
||||||
|
jc .ret
|
||||||
|
and dword [ebx-4], 0
|
||||||
|
mov dword [ebx], 2
|
||||||
|
.ret:
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
open:
|
||||||
|
; call make_fullpaths
|
||||||
|
|
||||||
|
;; mov eax,fullpath_open
|
||||||
|
;; DEBUGF '"%s"\n',eax
|
||||||
|
|
||||||
|
; mov dword[file_info_open+8],-1
|
||||||
|
; mcall 58,file_info_open
|
||||||
|
; or eax,eax ; found
|
||||||
|
; jz @f
|
||||||
|
; cmp eax,6
|
||||||
|
; jne file_error
|
||||||
|
;@@: mov [filesize],ebx
|
||||||
|
; clc
|
||||||
|
; ret
|
||||||
|
;file_error:
|
||||||
|
; stc
|
||||||
|
; ret
|
||||||
|
|
||||||
|
call alloc_handle
|
||||||
|
jc .ret
|
||||||
|
mov dword [ebx], 5
|
||||||
|
and dword [ebx+12], 0
|
||||||
|
mov dword [ebx+16], fileinfo
|
||||||
|
mov eax, 70
|
||||||
|
push ebx
|
||||||
|
mcall
|
||||||
|
pop ebx
|
||||||
|
test eax, eax
|
||||||
|
jnz .fail
|
||||||
|
mov eax, [fileinfo.size]
|
||||||
|
mov [ebx-4], eax
|
||||||
|
and dword [ebx], 0
|
||||||
|
.ret:
|
||||||
|
ret
|
||||||
|
.fail:
|
||||||
|
or dword [ebx], -1 ; close handle
|
||||||
|
stc
|
||||||
|
ret
|
||||||
|
|
||||||
|
read:
|
||||||
|
; pusha
|
||||||
|
; mov edi,edx
|
||||||
|
; mov esi,[filepos]
|
||||||
|
; add esi,0x20000
|
||||||
|
; cld
|
||||||
|
; rep movsb
|
||||||
|
; popa
|
||||||
|
;; ret
|
||||||
|
|
||||||
|
mov [ebx+12], ecx
|
||||||
|
mov [ebx+16], edx
|
||||||
|
push ebx
|
||||||
|
mov eax, 70
|
||||||
|
mcall
|
||||||
|
xchg eax, [esp]
|
||||||
|
add [eax+4], ebx
|
||||||
|
adc [eax+8], dword 0
|
||||||
|
mov ebx, eax
|
||||||
|
pop eax
|
||||||
|
test eax, eax
|
||||||
|
jz .ok
|
||||||
|
cmp eax, 6
|
||||||
|
jz .ok
|
||||||
|
stc
|
||||||
|
.ok:
|
||||||
|
ret
|
||||||
|
|
||||||
|
close:
|
||||||
|
or dword [ebx], -1
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
; ebx file handle
|
||||||
|
; ecx count of bytes to write
|
||||||
|
; edx pointer to buffer
|
||||||
|
write:
|
||||||
|
; pusha
|
||||||
|
; mov [file_info_write+8],ecx
|
||||||
|
; mov [file_info_write+12],edx
|
||||||
|
; mov [filesize],edx
|
||||||
|
; mov eax,58
|
||||||
|
; mov ebx,file_info_write
|
||||||
|
; mcall
|
||||||
|
; popa
|
||||||
|
; ret
|
||||||
|
|
||||||
|
mov [ebx+12], ecx
|
||||||
|
mov [ebx+16], edx
|
||||||
|
push ebx
|
||||||
|
mov eax, 70
|
||||||
|
mcall
|
||||||
|
xchg eax, [esp]
|
||||||
|
add [eax+4], ebx
|
||||||
|
adc [eax+8], dword 0
|
||||||
|
mov ebx, eax
|
||||||
|
pop eax
|
||||||
|
mov byte [ebx], 3
|
||||||
|
cmp eax, 1
|
||||||
|
cmc
|
||||||
|
ret
|
||||||
|
|
||||||
|
make_fullpaths:
|
||||||
|
pusha
|
||||||
|
push edx
|
||||||
|
|
||||||
|
mov esi,path ; open
|
||||||
|
; DEBUGF " '%s'",esi
|
||||||
|
mov edi,fullpath_open
|
||||||
|
cld
|
||||||
|
newc1:
|
||||||
|
movsb
|
||||||
|
cmp byte[esi],0;' '
|
||||||
|
jne newc1
|
||||||
|
mov esi,[esp]
|
||||||
|
|
||||||
|
cmp byte[esi],'/'
|
||||||
|
jne @f
|
||||||
|
mov edi,fullpath_open
|
||||||
|
|
||||||
|
@@:
|
||||||
|
lodsb
|
||||||
|
stosb
|
||||||
|
cmp al,0
|
||||||
|
jne @b
|
||||||
|
; mov ecx,12
|
||||||
|
; cld
|
||||||
|
; rep movsb
|
||||||
|
; mov byte[edi],0
|
||||||
|
|
||||||
|
mov esi,path ; write
|
||||||
|
mov edi,fullpath_write
|
||||||
|
cld
|
||||||
|
newc2:
|
||||||
|
movsb
|
||||||
|
cmp byte[esi],0;' '
|
||||||
|
jne newc2
|
||||||
|
mov esi,[esp]
|
||||||
|
|
||||||
|
cmp byte[esi],'/'
|
||||||
|
jne @f
|
||||||
|
mov edi,fullpath_write
|
||||||
|
|
||||||
|
@@:
|
||||||
|
lodsb
|
||||||
|
stosb
|
||||||
|
cmp al,0
|
||||||
|
jne @b
|
||||||
|
; mov ecx,12
|
||||||
|
; cld
|
||||||
|
; rep movsb
|
||||||
|
; mov byte[edi],0
|
||||||
|
|
||||||
|
mov esi,path ; start
|
||||||
|
mov edi,fullpath_start
|
||||||
|
cld
|
||||||
|
newc3:
|
||||||
|
movsb
|
||||||
|
cmp byte[esi],0;' '
|
||||||
|
jne newc3
|
||||||
|
; mov esi,[esp]
|
||||||
|
pop esi
|
||||||
|
|
||||||
|
cmp byte[esi],'/'
|
||||||
|
jne @f
|
||||||
|
mov edi,fullpath_start
|
||||||
|
|
||||||
|
@@:
|
||||||
|
lodsb
|
||||||
|
stosb
|
||||||
|
cmp al,0
|
||||||
|
jne @b
|
||||||
|
; mov ecx,12
|
||||||
|
; cld
|
||||||
|
; rep movsb
|
||||||
|
; mov byte[edi],0
|
||||||
|
|
||||||
|
; add esp,4
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
lseek:
|
||||||
|
cmp al,0
|
||||||
|
jnz @f
|
||||||
|
and dword [ebx+4], 0
|
||||||
|
and dword [ebx+8], 0
|
||||||
|
@@: cmp al,2
|
||||||
|
jnz @f
|
||||||
|
mov eax, [ebx-4]
|
||||||
|
mov [ebx+4], eax
|
||||||
|
and dword [ebx+8], 0
|
||||||
|
@@: add dword [ebx+4], edx
|
||||||
|
adc dword [ebx+8], 0
|
||||||
|
ret
|
||||||
|
|
||||||
|
display_character:
|
||||||
|
pusha
|
||||||
|
cmp [_mode],NORMAL_MODE
|
||||||
|
jne @f
|
||||||
|
cmp dl,13
|
||||||
|
jz dc2
|
||||||
|
cmp dl,0xa
|
||||||
|
jnz dc1
|
||||||
|
and [textxy],0x0000FFFF
|
||||||
|
add [textxy], 7 shl 16 +53 and 0xFFFF0000 + 10
|
||||||
|
dc2:
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
dc1:
|
||||||
|
mov eax,[textxy]
|
||||||
|
cmp ax,word[bottom_right]
|
||||||
|
ja dc2
|
||||||
|
shr eax,16
|
||||||
|
cmp ax,word[bottom_right+2]
|
||||||
|
ja dc2
|
||||||
|
mov [dc],dl
|
||||||
|
mcall 4,[textxy],[sc.work_text],dc,1
|
||||||
|
add [textxy],0x00060000
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
mov eax,63
|
||||||
|
mov ebx,1
|
||||||
|
mov cl,dl
|
||||||
|
mcall
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
display_string:
|
||||||
|
pusha
|
||||||
|
@@:
|
||||||
|
cmp byte[esi],0
|
||||||
|
je @f
|
||||||
|
mov dl,[esi]
|
||||||
|
call display_character
|
||||||
|
add esi,1
|
||||||
|
jmp @b
|
||||||
|
@@:
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
display_number:
|
||||||
|
push ebx
|
||||||
|
mov ecx,1000000000
|
||||||
|
xor edx,edx
|
||||||
|
xor bl,bl
|
||||||
|
display_loop:
|
||||||
|
div ecx
|
||||||
|
push edx
|
||||||
|
cmp ecx,1
|
||||||
|
je display_digit
|
||||||
|
or bl,bl
|
||||||
|
jnz display_digit
|
||||||
|
or al,al
|
||||||
|
jz digit_ok
|
||||||
|
not bl
|
||||||
|
display_digit:
|
||||||
|
mov dl,al
|
||||||
|
add dl,30h
|
||||||
|
push ebx ecx
|
||||||
|
call display_character
|
||||||
|
pop ecx ebx
|
||||||
|
digit_ok:
|
||||||
|
mov eax,ecx
|
||||||
|
xor edx,edx
|
||||||
|
mov ecx,10
|
||||||
|
div ecx
|
||||||
|
mov ecx,eax
|
||||||
|
pop eax
|
||||||
|
or ecx,ecx
|
||||||
|
jnz display_loop
|
||||||
|
pop ebx
|
||||||
|
ret
|
||||||
|
|
||||||
|
display_user_messages:
|
||||||
|
; push [skinh]
|
||||||
|
; pop [textxy]
|
||||||
|
; add [textxy], 7 shl 16 +53
|
||||||
|
mov [displayed_count],0
|
||||||
|
call show_display_buffer
|
||||||
|
cmp [displayed_count],1
|
||||||
|
jb line_break_ok
|
||||||
|
je make_line_break
|
||||||
|
mov ax,word[last_displayed]
|
||||||
|
cmp ax,0A0Dh
|
||||||
|
je line_break_ok
|
||||||
|
cmp ax,0D0Ah
|
||||||
|
je line_break_ok
|
||||||
|
make_line_break:
|
||||||
|
mov esi,lf
|
||||||
|
call display_string
|
||||||
|
line_break_ok:
|
||||||
|
ret
|
||||||
|
|
||||||
|
display_block:
|
||||||
|
pusha
|
||||||
|
@@: mov dl,[esi]
|
||||||
|
call display_character
|
||||||
|
inc esi
|
||||||
|
loop @b
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
fatal_error:
|
||||||
|
mov esi,error_prefix
|
||||||
|
call display_string
|
||||||
|
pop esi
|
||||||
|
call display_string
|
||||||
|
mov esi,error_suffix
|
||||||
|
call display_string
|
||||||
|
mov esi,lf
|
||||||
|
call display_string
|
||||||
|
mov al,0FFh
|
||||||
|
jmp exit_program
|
||||||
|
|
||||||
|
assembler_error:
|
||||||
|
call display_user_messages
|
||||||
|
push dword 0
|
||||||
|
mov ebx,[current_line]
|
||||||
|
get_error_lines:
|
||||||
|
push ebx
|
||||||
|
test byte [ebx+7],80h
|
||||||
|
jz display_error_line
|
||||||
|
mov edx,ebx
|
||||||
|
find_definition_origin:
|
||||||
|
mov edx,[edx+12]
|
||||||
|
test byte [edx+7],80h
|
||||||
|
jnz find_definition_origin
|
||||||
|
push edx
|
||||||
|
mov ebx,[ebx+8]
|
||||||
|
jmp get_error_lines
|
||||||
|
display_error_line:
|
||||||
|
mov esi,[ebx]
|
||||||
|
call display_string
|
||||||
|
mov esi,line_number_start
|
||||||
|
call display_string
|
||||||
|
mov eax,[ebx+4]
|
||||||
|
and eax,7FFFFFFFh
|
||||||
|
call display_number
|
||||||
|
mov dl,']'
|
||||||
|
call display_character
|
||||||
|
pop esi
|
||||||
|
cmp ebx,esi
|
||||||
|
je line_number_ok
|
||||||
|
mov dl,20h
|
||||||
|
call display_character
|
||||||
|
push esi
|
||||||
|
mov esi,[esi]
|
||||||
|
movzx ecx,byte [esi]
|
||||||
|
inc esi
|
||||||
|
call display_block
|
||||||
|
mov esi,line_number_start
|
||||||
|
call display_string
|
||||||
|
pop esi
|
||||||
|
mov eax,[esi+4]
|
||||||
|
and eax,7FFFFFFFh
|
||||||
|
call display_number
|
||||||
|
mov dl,']'
|
||||||
|
call display_character
|
||||||
|
line_number_ok:
|
||||||
|
mov esi,line_data_start
|
||||||
|
call display_string
|
||||||
|
mov esi,ebx
|
||||||
|
mov edx,[esi]
|
||||||
|
call open
|
||||||
|
mov al,2
|
||||||
|
xor edx,edx
|
||||||
|
call lseek
|
||||||
|
mov edx,[esi+8]
|
||||||
|
sub eax,edx
|
||||||
|
push eax
|
||||||
|
xor al,al
|
||||||
|
call lseek
|
||||||
|
mov ecx,[esp]
|
||||||
|
mov edx,[additional_memory]
|
||||||
|
lea eax,[edx+ecx]
|
||||||
|
cmp eax,[additional_memory_end]
|
||||||
|
ja out_of_memory
|
||||||
|
call read
|
||||||
|
call close
|
||||||
|
pop ecx
|
||||||
|
mov esi,[additional_memory]
|
||||||
|
get_line_data:
|
||||||
|
mov al,[esi]
|
||||||
|
cmp al,0Ah
|
||||||
|
je display_line_data
|
||||||
|
cmp al,0Dh
|
||||||
|
je display_line_data
|
||||||
|
cmp al,1Ah
|
||||||
|
je display_line_data
|
||||||
|
or al,al
|
||||||
|
jz display_line_data
|
||||||
|
inc esi
|
||||||
|
loop get_line_data
|
||||||
|
display_line_data:
|
||||||
|
mov ecx,esi
|
||||||
|
mov esi,[additional_memory]
|
||||||
|
sub ecx,esi
|
||||||
|
call display_block
|
||||||
|
mov esi,cr_lf
|
||||||
|
call display_string
|
||||||
|
pop ebx
|
||||||
|
or ebx,ebx
|
||||||
|
jnz display_error_line
|
||||||
|
mov esi,error_prefix
|
||||||
|
call display_string
|
||||||
|
pop esi
|
||||||
|
call display_string
|
||||||
|
mov esi,error_suffix
|
||||||
|
call display_string
|
||||||
|
jmp exit_program
|
||||||
|
|
||||||
|
align 4
|
||||||
|
fileinfo FILEINFO
|
||||||
|
|
||||||
|
character db ?,0
|
||||||
|
bytes_count dd ?
|
||||||
|
|
||||||
|
textxy dd 0x000500A0
|
||||||
|
dc db 0x0
|
||||||
|
filesize dd 0x0
|
||||||
|
|
||||||
|
displayed_count dd ?
|
||||||
|
last_displayed rb 2
|
||||||
|
|
||||||
|
error_prefix db 'error: ',0
|
||||||
|
error_suffix db '.',0
|
||||||
|
line_data_start db ':'
|
||||||
|
cr_lf db 0Dh,0Ah,0
|
||||||
|
line_number_start db ' [',0
|
||||||
|
|
||||||
|
macro dm string { db string,0 }
|
2028
programs/develop/fasm/tags/1.68/tables.inc
Normal file
2028
programs/develop/fasm/tags/1.68/tables.inc
Normal file
File diff suppressed because it is too large
Load Diff
130
programs/develop/fasm/tags/1.68/variable.inc
Normal file
130
programs/develop/fasm/tags/1.68/variable.inc
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
|
||||||
|
; flat assembler core variables
|
||||||
|
; Copyright (c) 1999-2009, Tomasz Grysztar.
|
||||||
|
; All rights reserved.
|
||||||
|
|
||||||
|
; Variables which have to be set up by interface:
|
||||||
|
|
||||||
|
memory_start dd ?
|
||||||
|
memory_end dd ?
|
||||||
|
|
||||||
|
additional_memory dd ?
|
||||||
|
additional_memory_end dd ?
|
||||||
|
|
||||||
|
stack_limit dd ?
|
||||||
|
|
||||||
|
input_file dd ?
|
||||||
|
output_file dd ?
|
||||||
|
symbols_file dd ?
|
||||||
|
|
||||||
|
passes_limit dw ?
|
||||||
|
|
||||||
|
; Internal core variables:
|
||||||
|
|
||||||
|
current_pass dw ?
|
||||||
|
|
||||||
|
include_paths dd ?
|
||||||
|
free_additional_memory dd ?
|
||||||
|
source_start dd ?
|
||||||
|
code_start dd ?
|
||||||
|
code_size dd ?
|
||||||
|
real_code_size dd ?
|
||||||
|
written_size dd ?
|
||||||
|
headers_size dd ?
|
||||||
|
|
||||||
|
current_line dd ?
|
||||||
|
macro_line dd ?
|
||||||
|
macro_block dd ?
|
||||||
|
macro_block_line dd ?
|
||||||
|
macro_block_line_number dd ?
|
||||||
|
macro_symbols dd ?
|
||||||
|
struc_name dd ?
|
||||||
|
struc_label dd ?
|
||||||
|
instant_macro_start dd ?
|
||||||
|
parameters_end dd ?
|
||||||
|
locals_counter rb 8
|
||||||
|
current_locals_prefix dd ?
|
||||||
|
anonymous_reverse dd ?
|
||||||
|
anonymous_forward dd ?
|
||||||
|
labels_list dd ?
|
||||||
|
label_hash dd ?
|
||||||
|
label_leaf dd ?
|
||||||
|
hash_tree dd ?
|
||||||
|
org_origin dq ?
|
||||||
|
org_registers dd ?
|
||||||
|
org_symbol dd ?
|
||||||
|
org_start dd ?
|
||||||
|
undefined_data_start dd ?
|
||||||
|
undefined_data_end dd ?
|
||||||
|
counter dd ?
|
||||||
|
counter_limit dd ?
|
||||||
|
error_info dd ?
|
||||||
|
error_line dd ?
|
||||||
|
error dd ?
|
||||||
|
display_buffer dd ?
|
||||||
|
structures_buffer dd ?
|
||||||
|
number_start dd ?
|
||||||
|
current_offset dd ?
|
||||||
|
value dq ?
|
||||||
|
fp_value rd 8
|
||||||
|
adjustment dq ?
|
||||||
|
symbol_identifier dd ?
|
||||||
|
address_symbol dd ?
|
||||||
|
address_high dd ?
|
||||||
|
format_flags dd ?
|
||||||
|
resolver_flags dd ?
|
||||||
|
symbols_stream dd ?
|
||||||
|
number_of_relocations dd ?
|
||||||
|
number_of_sections dd ?
|
||||||
|
stub_size dd ?
|
||||||
|
stub_file dd ?
|
||||||
|
current_section dd ?
|
||||||
|
machine dw ?
|
||||||
|
subsystem dw ?
|
||||||
|
subsystem_version dd ?
|
||||||
|
image_base dd ?
|
||||||
|
image_base_high dd ?
|
||||||
|
resource_data dd ?
|
||||||
|
resource_size dd ?
|
||||||
|
parenthesis_stack dd ?
|
||||||
|
blocks_stack dd ?
|
||||||
|
parsed_lines dd ?
|
||||||
|
logical_value_parentheses dd ?
|
||||||
|
file_extension dd ?
|
||||||
|
|
||||||
|
labels_type db ?
|
||||||
|
code_type db ?
|
||||||
|
virtual_data db ?
|
||||||
|
|
||||||
|
operand_size db ?
|
||||||
|
size_override db ?
|
||||||
|
operand_prefix db ?
|
||||||
|
rex_prefix db ?
|
||||||
|
opcode_prefix db ?
|
||||||
|
base_code db ?
|
||||||
|
extended_code db ?
|
||||||
|
supplemental_code db ?
|
||||||
|
postbyte_register db ?
|
||||||
|
|
||||||
|
immediate_size db ?
|
||||||
|
mmx_size db ?
|
||||||
|
jump_type db ?
|
||||||
|
push_size db ?
|
||||||
|
value_size db ?
|
||||||
|
address_size db ?
|
||||||
|
size_declared db ?
|
||||||
|
value_undefined db ?
|
||||||
|
value_type db ?
|
||||||
|
compare_type db ?
|
||||||
|
logical_value_wrapping db ?
|
||||||
|
next_pass_needed db ?
|
||||||
|
macro_status db ?
|
||||||
|
segment_register db ?
|
||||||
|
prefixed_instruction db ?
|
||||||
|
fp_sign db ?
|
||||||
|
fp_format db ?
|
||||||
|
output_format db ?
|
||||||
|
|
||||||
|
characters rb 100h
|
||||||
|
converted rb 100h
|
||||||
|
message rb 200h
|
39
programs/develop/fasm/tags/1.68/version.inc
Normal file
39
programs/develop/fasm/tags/1.68/version.inc
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
; flat assembler version 1.68
|
||||||
|
; Copyright (c) 1999-2009, Tomasz Grysztar.
|
||||||
|
; All rights reserved.
|
||||||
|
;
|
||||||
|
; This programs is free for commercial and non-commercial use as long as
|
||||||
|
; the following conditions are adhered to.
|
||||||
|
;
|
||||||
|
; Redistribution and use in source and binary forms, with or without
|
||||||
|
; modification, are permitted provided that the following conditions are
|
||||||
|
; met:
|
||||||
|
;
|
||||||
|
; 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
; this list of conditions and the following disclaimer.
|
||||||
|
; 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
; notice, this list of conditions and the following disclaimer in the
|
||||||
|
; documentation and/or other materials provided with the distribution.
|
||||||
|
;
|
||||||
|
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
|
||||||
|
; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
;
|
||||||
|
; The licence and distribution terms for any publically available
|
||||||
|
; version or derivative of this code cannot be changed. i.e. this code
|
||||||
|
; cannot simply be copied and put under another distribution licence
|
||||||
|
; (including the GNU Public Licence).
|
||||||
|
|
||||||
|
VERSION_STRING equ "1.68"
|
||||||
|
|
||||||
|
VERSION_MAJOR = 1
|
||||||
|
VERSION_MINOR = 68
|
7034
programs/develop/fasm/tags/1.68/x86_64.inc
Normal file
7034
programs/develop/fasm/tags/1.68/x86_64.inc
Normal file
File diff suppressed because it is too large
Load Diff
@ -2,6 +2,57 @@
|
|||||||
Visit http://flatassembler.net/ for more information.
|
Visit http://flatassembler.net/ for more information.
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
version 1.68 (Jun 13, 2009)
|
||||||
|
|
||||||
[+] Added SSSE3 (Supplemental SSE3), SSE4.1, SSE4.2 and SSE4a instructions.
|
[+] Added SSSE3 (Supplemental SSE3), SSE4.1, SSE4.2 and SSE4a instructions.
|
||||||
|
@ -115,7 +115,12 @@ assembler:
|
|||||||
or eax,eax
|
or eax,eax
|
||||||
jz assemble_ok
|
jz assemble_ok
|
||||||
mov [current_line],eax
|
mov [current_line],eax
|
||||||
jmp near [error]
|
call error_handler
|
||||||
|
error_handler:
|
||||||
|
mov eax,[error]
|
||||||
|
sub eax,error_handler
|
||||||
|
add [esp],eax
|
||||||
|
ret
|
||||||
next_pass:
|
next_pass:
|
||||||
inc [current_pass]
|
inc [current_pass]
|
||||||
mov ax,[current_pass]
|
mov ax,[current_pass]
|
||||||
@ -359,11 +364,13 @@ assemble_line:
|
|||||||
mov dword [operand_size],0
|
mov dword [operand_size],0
|
||||||
mov [opcode_prefix],0
|
mov [opcode_prefix],0
|
||||||
mov [immediate_size],0
|
mov [immediate_size],0
|
||||||
|
call instruction_handler
|
||||||
|
instruction_handler:
|
||||||
movzx ebx,word [esi]
|
movzx ebx,word [esi]
|
||||||
mov al,[esi+2]
|
mov al,[esi+2]
|
||||||
add ebx,assembler
|
|
||||||
add esi,3
|
add esi,3
|
||||||
jmp near ebx
|
add [esp],ebx
|
||||||
|
ret
|
||||||
instruction_assembled:
|
instruction_assembled:
|
||||||
mov al,[esi]
|
mov al,[esi]
|
||||||
cmp al,0Fh
|
cmp al,0Fh
|
||||||
@ -894,7 +901,7 @@ virtual_directive:
|
|||||||
mov byte [org_registers+2],ch
|
mov byte [org_registers+2],ch
|
||||||
mov byte [org_registers+3],cl
|
mov byte [org_registers+3],cl
|
||||||
call allocate_structure_data
|
call allocate_structure_data
|
||||||
mov word [ebx],virtual_directive-assembler
|
mov word [ebx],virtual_directive-instruction_handler
|
||||||
not eax
|
not eax
|
||||||
not edx
|
not edx
|
||||||
add eax,1
|
add eax,1
|
||||||
@ -993,7 +1000,7 @@ repeat_directive:
|
|||||||
je zero_repeat
|
je zero_repeat
|
||||||
jl negative_repeat
|
jl negative_repeat
|
||||||
call allocate_structure_data
|
call allocate_structure_data
|
||||||
mov word [ebx],repeat_directive-assembler
|
mov word [ebx],repeat_directive-instruction_handler
|
||||||
xchg eax,[counter_limit]
|
xchg eax,[counter_limit]
|
||||||
mov [ebx+10h],eax
|
mov [ebx+10h],eax
|
||||||
mov eax,1
|
mov eax,1
|
||||||
@ -1038,14 +1045,14 @@ repeat_directive:
|
|||||||
jmp instruction_assembled
|
jmp instruction_assembled
|
||||||
find_end_repeat:
|
find_end_repeat:
|
||||||
call find_structure_end
|
call find_structure_end
|
||||||
cmp ax,repeat_directive-assembler
|
cmp ax,repeat_directive-instruction_handler
|
||||||
jne unexpected_instruction
|
jne unexpected_instruction
|
||||||
ret
|
ret
|
||||||
while_directive:
|
while_directive:
|
||||||
cmp [prefixed_instruction],0
|
cmp [prefixed_instruction],0
|
||||||
jne unexpected_instruction
|
jne unexpected_instruction
|
||||||
call allocate_structure_data
|
call allocate_structure_data
|
||||||
mov word [ebx],while_directive-assembler
|
mov word [ebx],while_directive-instruction_handler
|
||||||
mov eax,1
|
mov eax,1
|
||||||
xchg eax,[counter]
|
xchg eax,[counter]
|
||||||
mov [ebx+10h],eax
|
mov [ebx+10h],eax
|
||||||
@ -1085,7 +1092,7 @@ while_directive:
|
|||||||
jmp do_while
|
jmp do_while
|
||||||
find_end_while:
|
find_end_while:
|
||||||
call find_structure_end
|
call find_structure_end
|
||||||
cmp ax,while_directive-assembler
|
cmp ax,while_directive-instruction_handler
|
||||||
jne unexpected_instruction
|
jne unexpected_instruction
|
||||||
ret
|
ret
|
||||||
if_directive:
|
if_directive:
|
||||||
@ -1105,7 +1112,7 @@ if_directive:
|
|||||||
mov al,[esi]
|
mov al,[esi]
|
||||||
cmp al,1
|
cmp al,1
|
||||||
jne else_true
|
jne else_true
|
||||||
cmp word [esi+1],if_directive-assembler
|
cmp word [esi+1],if_directive-instruction_handler
|
||||||
jne else_true
|
jne else_true
|
||||||
add esi,4
|
add esi,4
|
||||||
jmp if_directive
|
jmp if_directive
|
||||||
@ -1113,7 +1120,7 @@ if_directive:
|
|||||||
xor al,al
|
xor al,al
|
||||||
make_if_structure:
|
make_if_structure:
|
||||||
call allocate_structure_data
|
call allocate_structure_data
|
||||||
mov word [ebx],if_directive-assembler
|
mov word [ebx],if_directive-instruction_handler
|
||||||
mov byte [ebx+2],al
|
mov byte [ebx+2],al
|
||||||
mov eax,[current_line]
|
mov eax,[current_line]
|
||||||
mov [ebx+4],eax
|
mov [ebx+4],eax
|
||||||
@ -1128,7 +1135,7 @@ if_directive:
|
|||||||
else_directive:
|
else_directive:
|
||||||
cmp [prefixed_instruction],0
|
cmp [prefixed_instruction],0
|
||||||
jne unexpected_instruction
|
jne unexpected_instruction
|
||||||
mov ax,if_directive-assembler
|
mov ax,if_directive-instruction_handler
|
||||||
call find_structure_data
|
call find_structure_data
|
||||||
jc unexpected_instruction
|
jc unexpected_instruction
|
||||||
cmp byte [ebx+2],0
|
cmp byte [ebx+2],0
|
||||||
@ -1137,7 +1144,7 @@ if_directive:
|
|||||||
mov al,[esi]
|
mov al,[esi]
|
||||||
cmp al,1
|
cmp al,1
|
||||||
jne skip_else
|
jne skip_else
|
||||||
cmp word [esi+1],if_directive-assembler
|
cmp word [esi+1],if_directive-instruction_handler
|
||||||
jne skip_else
|
jne skip_else
|
||||||
add esi,4
|
add esi,4
|
||||||
call find_else
|
call find_else
|
||||||
@ -1161,9 +1168,9 @@ if_directive:
|
|||||||
jmp instruction_assembled
|
jmp instruction_assembled
|
||||||
find_else:
|
find_else:
|
||||||
call find_structure_end
|
call find_structure_end
|
||||||
cmp ax,else_directive-assembler
|
cmp ax,else_directive-instruction_handler
|
||||||
je else_found
|
je else_found
|
||||||
cmp ax,if_directive-assembler
|
cmp ax,if_directive-instruction_handler
|
||||||
jne unexpected_instruction
|
jne unexpected_instruction
|
||||||
stc
|
stc
|
||||||
ret
|
ret
|
||||||
@ -1172,7 +1179,7 @@ if_directive:
|
|||||||
ret
|
ret
|
||||||
find_end_if:
|
find_end_if:
|
||||||
call find_structure_end
|
call find_structure_end
|
||||||
cmp ax,if_directive-assembler
|
cmp ax,if_directive-instruction_handler
|
||||||
jne unexpected_instruction
|
jne unexpected_instruction
|
||||||
ret
|
ret
|
||||||
find_structure_end:
|
find_structure_end:
|
||||||
@ -1195,28 +1202,28 @@ if_directive:
|
|||||||
cmp byte [esi],1
|
cmp byte [esi],1
|
||||||
jne find_end_directive
|
jne find_end_directive
|
||||||
mov ax,[esi+1]
|
mov ax,[esi+1]
|
||||||
cmp ax,prefix_instruction-assembler
|
cmp ax,prefix_instruction-instruction_handler
|
||||||
je find_end_directive
|
je find_end_directive
|
||||||
add esi,4
|
add esi,4
|
||||||
cmp ax,repeat_directive-assembler
|
cmp ax,repeat_directive-instruction_handler
|
||||||
je skip_repeat
|
je skip_repeat
|
||||||
cmp ax,while_directive-assembler
|
cmp ax,while_directive-instruction_handler
|
||||||
je skip_while
|
je skip_while
|
||||||
cmp ax,if_directive-assembler
|
cmp ax,if_directive-instruction_handler
|
||||||
je skip_if
|
je skip_if
|
||||||
cmp ax,else_directive-assembler
|
cmp ax,else_directive-instruction_handler
|
||||||
je structure_end
|
je structure_end
|
||||||
cmp ax,end_directive-assembler
|
cmp ax,end_directive-instruction_handler
|
||||||
jne find_end_directive
|
jne find_end_directive
|
||||||
cmp byte [esi],1
|
cmp byte [esi],1
|
||||||
jne find_end_directive
|
jne find_end_directive
|
||||||
mov ax,[esi+1]
|
mov ax,[esi+1]
|
||||||
add esi,4
|
add esi,4
|
||||||
cmp ax,repeat_directive-assembler
|
cmp ax,repeat_directive-instruction_handler
|
||||||
je structure_end
|
je structure_end
|
||||||
cmp ax,while_directive-assembler
|
cmp ax,while_directive-instruction_handler
|
||||||
je structure_end
|
je structure_end
|
||||||
cmp ax,if_directive-assembler
|
cmp ax,if_directive-instruction_handler
|
||||||
jne find_end_directive
|
jne find_end_directive
|
||||||
structure_end:
|
structure_end:
|
||||||
pop [error_line]
|
pop [error_line]
|
||||||
@ -1239,7 +1246,7 @@ if_directive:
|
|||||||
jc if_block_skipped
|
jc if_block_skipped
|
||||||
cmp byte [esi],1
|
cmp byte [esi],1
|
||||||
jne skip_after_else
|
jne skip_after_else
|
||||||
cmp word [esi+1],if_directive-assembler
|
cmp word [esi+1],if_directive-instruction_handler
|
||||||
jne skip_after_else
|
jne skip_after_else
|
||||||
add esi,4
|
add esi,4
|
||||||
jmp skip_if_block
|
jmp skip_if_block
|
||||||
@ -1253,15 +1260,15 @@ end_directive:
|
|||||||
jne invalid_argument
|
jne invalid_argument
|
||||||
lods word [esi]
|
lods word [esi]
|
||||||
inc esi
|
inc esi
|
||||||
cmp ax,virtual_directive-assembler
|
cmp ax,virtual_directive-instruction_handler
|
||||||
je end_virtual
|
je end_virtual
|
||||||
cmp ax,repeat_directive-assembler
|
cmp ax,repeat_directive-instruction_handler
|
||||||
je end_repeat
|
je end_repeat
|
||||||
cmp ax,while_directive-assembler
|
cmp ax,while_directive-instruction_handler
|
||||||
je end_while
|
je end_while
|
||||||
cmp ax,if_directive-assembler
|
cmp ax,if_directive-instruction_handler
|
||||||
je end_if
|
je end_if
|
||||||
cmp ax,data_directive-assembler
|
cmp ax,data_directive-instruction_handler
|
||||||
je end_data
|
je end_data
|
||||||
jmp invalid_argument
|
jmp invalid_argument
|
||||||
break_directive:
|
break_directive:
|
||||||
@ -1275,11 +1282,11 @@ break_directive:
|
|||||||
cmp ebx,[additional_memory_end]
|
cmp ebx,[additional_memory_end]
|
||||||
je unexpected_instruction
|
je unexpected_instruction
|
||||||
mov ax,[ebx]
|
mov ax,[ebx]
|
||||||
cmp ax,repeat_directive-assembler
|
cmp ax,repeat_directive-instruction_handler
|
||||||
je break_repeat
|
je break_repeat
|
||||||
cmp ax,while_directive-assembler
|
cmp ax,while_directive-instruction_handler
|
||||||
je break_while
|
je break_while
|
||||||
cmp ax,if_directive-assembler
|
cmp ax,if_directive-instruction_handler
|
||||||
je break_if
|
je break_if
|
||||||
add ebx,20h
|
add ebx,20h
|
||||||
jmp find_breakable_structure
|
jmp find_breakable_structure
|
||||||
@ -1688,6 +1695,7 @@ data_file:
|
|||||||
pop ebx
|
pop ebx
|
||||||
mov edx,eax
|
mov edx,eax
|
||||||
sub [esp],edx
|
sub [esp],edx
|
||||||
|
jc value_out_of_range
|
||||||
position_ok:
|
position_ok:
|
||||||
cmp byte [esi],','
|
cmp byte [esi],','
|
||||||
jne size_ok
|
jne size_ok
|
||||||
@ -1700,6 +1708,8 @@ data_file:
|
|||||||
push ebx edx
|
push ebx edx
|
||||||
call get_dword_value
|
call get_dword_value
|
||||||
pop edx ebx
|
pop edx ebx
|
||||||
|
cmp eax,[esp]
|
||||||
|
ja value_out_of_range
|
||||||
mov [esp],eax
|
mov [esp],eax
|
||||||
size_ok:
|
size_ok:
|
||||||
xor al,al
|
xor al,al
|
||||||
|
@ -76,8 +76,18 @@ convert_expression:
|
|||||||
|
|
||||||
convert_number:
|
convert_number:
|
||||||
lea eax,[edi-10h]
|
lea eax,[edi-10h]
|
||||||
cmp eax,[labels_list]
|
mov edx,[memory_end]
|
||||||
|
cmp [source_start],0
|
||||||
|
je check_memory_for_number
|
||||||
|
mov edx,[labels_list]
|
||||||
|
check_memory_for_number:
|
||||||
|
cmp eax,edx
|
||||||
jae out_of_memory
|
jae out_of_memory
|
||||||
|
mov eax,esp
|
||||||
|
sub eax,100h
|
||||||
|
jc stack_overflow
|
||||||
|
cmp eax,[stack_limit]
|
||||||
|
jb stack_overflow
|
||||||
cmp byte [esi],'('
|
cmp byte [esi],'('
|
||||||
je expression_value
|
je expression_value
|
||||||
inc edi
|
inc edi
|
||||||
@ -111,11 +121,6 @@ convert_number:
|
|||||||
scas word [edi]
|
scas word [edi]
|
||||||
ret
|
ret
|
||||||
expression_value:
|
expression_value:
|
||||||
mov eax,esp
|
|
||||||
sub eax,100h
|
|
||||||
jc stack_overflow
|
|
||||||
cmp eax,[stack_limit]
|
|
||||||
jb stack_overflow
|
|
||||||
inc esi
|
inc esi
|
||||||
push [current_offset]
|
push [current_offset]
|
||||||
call convert_expression
|
call convert_expression
|
||||||
@ -125,6 +130,8 @@ convert_number:
|
|||||||
jne invalid_expression
|
jne invalid_expression
|
||||||
ret
|
ret
|
||||||
symbol_value:
|
symbol_value:
|
||||||
|
cmp [source_start],0
|
||||||
|
je preprocessor_value
|
||||||
push edi
|
push edi
|
||||||
mov edi,address_registers
|
mov edi,address_registers
|
||||||
call get_operator
|
call get_operator
|
||||||
@ -153,6 +160,23 @@ convert_number:
|
|||||||
mov byte [edi-1],10h
|
mov byte [edi-1],10h
|
||||||
stos byte [edi]
|
stos byte [edi]
|
||||||
ret
|
ret
|
||||||
|
preprocessor_value:
|
||||||
|
dec edi
|
||||||
|
lods byte [esi]
|
||||||
|
cmp al,1Ah
|
||||||
|
jne invalid_value
|
||||||
|
lods byte [esi]
|
||||||
|
mov cl,al
|
||||||
|
mov ch,10b
|
||||||
|
call get_preprocessor_symbol
|
||||||
|
jc invalid_value
|
||||||
|
push esi
|
||||||
|
mov esi,[edx+8]
|
||||||
|
push [current_offset]
|
||||||
|
call convert_expression
|
||||||
|
pop [current_offset]
|
||||||
|
pop esi
|
||||||
|
ret
|
||||||
|
|
||||||
get_number:
|
get_number:
|
||||||
xor ebp,ebp
|
xor ebp,ebp
|
||||||
@ -1043,7 +1067,12 @@ calculate_expression:
|
|||||||
jmp calculation_loop
|
jmp calculation_loop
|
||||||
timestamp_label:
|
timestamp_label:
|
||||||
call make_timestamp
|
call make_timestamp
|
||||||
jmp make_dword_label_value
|
make_qword_label_value:
|
||||||
|
stos dword [edi]
|
||||||
|
mov eax,edx
|
||||||
|
stos dword [edi]
|
||||||
|
add edi,0Ch
|
||||||
|
jmp calculation_loop
|
||||||
predefined_label:
|
predefined_label:
|
||||||
or eax,eax
|
or eax,eax
|
||||||
jz current_offset_label
|
jz current_offset_label
|
||||||
|
@ -133,7 +133,7 @@ formatter:
|
|||||||
mov [edi],ecx
|
mov [edi],ecx
|
||||||
or dword [edi+4],-1
|
or dword [edi+4],-1
|
||||||
sub edi,ecx
|
sub edi,ecx
|
||||||
cmp edi,[esp]
|
cmp edi,[current_offset]
|
||||||
jbe out_of_memory
|
jbe out_of_memory
|
||||||
mov [display_buffer],edi
|
mov [display_buffer],edi
|
||||||
mov esi,[memory_end]
|
mov esi,[memory_end]
|
||||||
@ -1301,7 +1301,7 @@ data_directive:
|
|||||||
or ecx,ecx
|
or ecx,ecx
|
||||||
jnz data_already_defined
|
jnz data_already_defined
|
||||||
call allocate_structure_data
|
call allocate_structure_data
|
||||||
mov word [ebx],data_directive-assembler
|
mov word [ebx],data_directive-instruction_handler
|
||||||
mov [ebx+2],al
|
mov [ebx+2],al
|
||||||
mov edx,[current_line]
|
mov edx,[current_line]
|
||||||
mov [ebx+4],edx
|
mov [ebx+4],edx
|
||||||
@ -3591,6 +3591,18 @@ elf_formatter:
|
|||||||
format_elf_exe:
|
format_elf_exe:
|
||||||
add esi,2
|
add esi,2
|
||||||
or [format_flags],1
|
or [format_flags],1
|
||||||
|
cmp byte [esi],'('
|
||||||
|
jne elf_exe_brand_ok
|
||||||
|
inc esi
|
||||||
|
cmp byte [esi],'.'
|
||||||
|
je invalid_value
|
||||||
|
push edx
|
||||||
|
call get_byte_value
|
||||||
|
cmp [value_type],0
|
||||||
|
jne invalid_use_of_symbol
|
||||||
|
pop edx
|
||||||
|
mov [edx+7],al
|
||||||
|
elf_exe_brand_ok:
|
||||||
mov [image_base],8048000h
|
mov [image_base],8048000h
|
||||||
cmp byte [esi],80h
|
cmp byte [esi],80h
|
||||||
jne elf_exe_base_ok
|
jne elf_exe_base_ok
|
||||||
@ -3643,6 +3655,18 @@ format_elf_exe:
|
|||||||
format_elf64_exe:
|
format_elf64_exe:
|
||||||
add esi,2
|
add esi,2
|
||||||
or [format_flags],1
|
or [format_flags],1
|
||||||
|
cmp byte [esi],'('
|
||||||
|
jne elf64_exe_brand_ok
|
||||||
|
inc esi
|
||||||
|
cmp byte [esi],'.'
|
||||||
|
je invalid_value
|
||||||
|
push edx
|
||||||
|
call get_byte_value
|
||||||
|
cmp [value_type],0
|
||||||
|
jne invalid_use_of_symbol
|
||||||
|
pop edx
|
||||||
|
mov [edx+7],al
|
||||||
|
elf64_exe_brand_ok:
|
||||||
mov [image_base],400000h
|
mov [image_base],400000h
|
||||||
mov [image_base_high],0
|
mov [image_base_high],0
|
||||||
cmp byte [esi],80h
|
cmp byte [esi],80h
|
||||||
@ -3748,6 +3772,8 @@ elf_segment:
|
|||||||
mov byte [ebx],1
|
mov byte [ebx],1
|
||||||
mov word [ebx+1Ch],1000h
|
mov word [ebx+1Ch],1000h
|
||||||
elf_segment_flags:
|
elf_segment_flags:
|
||||||
|
cmp byte [esi],1Eh
|
||||||
|
je elf_segment_type
|
||||||
cmp byte [esi],19h
|
cmp byte [esi],19h
|
||||||
jne elf_segment_flags_ok
|
jne elf_segment_flags_ok
|
||||||
lods word [esi]
|
lods word [esi]
|
||||||
@ -3766,6 +3792,25 @@ elf_segment:
|
|||||||
jnz setting_already_specified
|
jnz setting_already_specified
|
||||||
or [ebx+18h],ah
|
or [ebx+18h],ah
|
||||||
jmp elf_segment_flags
|
jmp elf_segment_flags
|
||||||
|
elf_segment_type:
|
||||||
|
cmp byte [ebx],1
|
||||||
|
jne setting_already_specified
|
||||||
|
lods word [esi]
|
||||||
|
mov ecx,[number_of_sections]
|
||||||
|
jecxz elf_segment_type_ok
|
||||||
|
mov edx,[code_start]
|
||||||
|
add edx,34h
|
||||||
|
scan_elf_segment_types:
|
||||||
|
cmp edx,[symbols_stream]
|
||||||
|
jae elf_segment_type_ok
|
||||||
|
cmp [edx],ah
|
||||||
|
je data_already_defined
|
||||||
|
add edx,20h
|
||||||
|
loop scan_elf_segment_types
|
||||||
|
elf_segment_type_ok:
|
||||||
|
mov [ebx],ah
|
||||||
|
mov word [ebx+1Ch],1
|
||||||
|
jmp elf_segment_flags
|
||||||
elf_segment_flags_ok:
|
elf_segment_flags_ok:
|
||||||
mov eax,edi
|
mov eax,edi
|
||||||
sub eax,[code_start]
|
sub eax,[code_start]
|
||||||
@ -3824,8 +3869,11 @@ elf_segment:
|
|||||||
sub eax,edx
|
sub eax,edx
|
||||||
mov [ebx+10h],eax
|
mov [ebx+10h],eax
|
||||||
mov eax,[ebx+8]
|
mov eax,[ebx+8]
|
||||||
|
cmp byte [ebx],1
|
||||||
|
jne elf_segment_position_ok
|
||||||
add eax,[ebx+14h]
|
add eax,[ebx+14h]
|
||||||
add eax,0FFFh
|
add eax,0FFFh
|
||||||
|
elf_segment_position_ok:
|
||||||
and eax,not 0FFFh
|
and eax,not 0FFFh
|
||||||
ret
|
ret
|
||||||
elf64_segment:
|
elf64_segment:
|
||||||
@ -3850,6 +3898,8 @@ elf_segment:
|
|||||||
mov byte [ebx],1
|
mov byte [ebx],1
|
||||||
mov word [ebx+30h],1000h
|
mov word [ebx+30h],1000h
|
||||||
elf64_segment_flags:
|
elf64_segment_flags:
|
||||||
|
cmp byte [esi],1Eh
|
||||||
|
je elf64_segment_type
|
||||||
cmp byte [esi],19h
|
cmp byte [esi],19h
|
||||||
jne elf64_segment_flags_ok
|
jne elf64_segment_flags_ok
|
||||||
lods word [esi]
|
lods word [esi]
|
||||||
@ -3868,6 +3918,25 @@ elf_segment:
|
|||||||
jnz setting_already_specified
|
jnz setting_already_specified
|
||||||
or [ebx+4],ah
|
or [ebx+4],ah
|
||||||
jmp elf64_segment_flags
|
jmp elf64_segment_flags
|
||||||
|
elf64_segment_type:
|
||||||
|
cmp byte [ebx],1
|
||||||
|
jne setting_already_specified
|
||||||
|
lods word [esi]
|
||||||
|
mov ecx,[number_of_sections]
|
||||||
|
jecxz elf64_segment_type_ok
|
||||||
|
mov edx,[code_start]
|
||||||
|
add edx,40h
|
||||||
|
scan_elf64_segment_types:
|
||||||
|
cmp edx,[symbols_stream]
|
||||||
|
jae elf64_segment_type_ok
|
||||||
|
cmp [edx],ah
|
||||||
|
je data_already_defined
|
||||||
|
add edx,38h
|
||||||
|
loop scan_elf64_segment_types
|
||||||
|
elf64_segment_type_ok:
|
||||||
|
mov [ebx],ah
|
||||||
|
mov word [ebx+30h],1
|
||||||
|
jmp elf64_segment_flags
|
||||||
elf64_segment_flags_ok:
|
elf64_segment_flags_ok:
|
||||||
mov ecx,edi
|
mov ecx,edi
|
||||||
sub ecx,[code_start]
|
sub ecx,[code_start]
|
||||||
@ -3929,17 +3998,16 @@ elf_segment:
|
|||||||
mov [ebx+20h],eax
|
mov [ebx+20h],eax
|
||||||
mov eax,[ebx+10h]
|
mov eax,[ebx+10h]
|
||||||
mov edx,[ebx+10h+4]
|
mov edx,[ebx+10h+4]
|
||||||
|
cmp byte [ebx],1
|
||||||
|
jne elf64_segment_position_ok
|
||||||
add eax,[ebx+28h]
|
add eax,[ebx+28h]
|
||||||
adc edx,0
|
adc edx,0
|
||||||
sub eax,1
|
add eax,0FFFh
|
||||||
sbb edx,0
|
|
||||||
shrd eax,edx,12
|
|
||||||
shr edx,12
|
|
||||||
add eax,1
|
|
||||||
adc edx,0
|
adc edx,0
|
||||||
shld edx,eax,12
|
elf64_segment_position_ok:
|
||||||
shl eax,12
|
and eax,not 0FFFh
|
||||||
ret
|
ret
|
||||||
|
|
||||||
close_elf_exe:
|
close_elf_exe:
|
||||||
test [format_flags],8
|
test [format_flags],8
|
||||||
jnz close_elf64_exe
|
jnz close_elf64_exe
|
||||||
@ -4149,8 +4217,26 @@ dump_symbols:
|
|||||||
sub [esi+12],eax
|
sub [esi+12],eax
|
||||||
prepare_next_preprocessed_line:
|
prepare_next_preprocessed_line:
|
||||||
add esi,16
|
add esi,16
|
||||||
call skip_foreign_line
|
skip_preprocessed_line:
|
||||||
|
lods byte [esi]
|
||||||
|
cmp al,1Ah
|
||||||
|
je skip_preprocessed_symbol
|
||||||
|
cmp al,3Bh
|
||||||
|
je skip_preprocessed_symbol
|
||||||
|
cmp al,22h
|
||||||
|
je skip_preprocessed_string
|
||||||
|
or al,al
|
||||||
|
jnz skip_preprocessed_line
|
||||||
jmp prepare_preprocessed_source
|
jmp prepare_preprocessed_source
|
||||||
|
skip_preprocessed_string:
|
||||||
|
lods dword [esi]
|
||||||
|
add esi,eax
|
||||||
|
jmp skip_preprocessed_line
|
||||||
|
skip_preprocessed_symbol:
|
||||||
|
lods byte [esi]
|
||||||
|
movzx eax,al
|
||||||
|
add esi,eax
|
||||||
|
jmp skip_preprocessed_line
|
||||||
preprocessed_source_ok:
|
preprocessed_source_ok:
|
||||||
mov esi,[labels_list]
|
mov esi,[labels_list]
|
||||||
mov ebp,edi
|
mov ebp,edi
|
||||||
|
@ -104,15 +104,15 @@ parser:
|
|||||||
stos word [edi]
|
stos word [edi]
|
||||||
mov al,dl
|
mov al,dl
|
||||||
stos byte [edi]
|
stos byte [edi]
|
||||||
cmp bx,if_directive-assembler
|
cmp bx,if_directive-instruction_handler
|
||||||
je parse_block
|
je parse_block
|
||||||
cmp bx,repeat_directive-assembler
|
cmp bx,repeat_directive-instruction_handler
|
||||||
je parse_block
|
je parse_block
|
||||||
cmp bx,while_directive-assembler
|
cmp bx,while_directive-instruction_handler
|
||||||
je parse_block
|
je parse_block
|
||||||
cmp bx,end_directive-assembler
|
cmp bx,end_directive-instruction_handler
|
||||||
je parse_end_directive
|
je parse_end_directive
|
||||||
cmp bx,else_directive-assembler
|
cmp bx,else_directive-instruction_handler
|
||||||
je parse_else
|
je parse_else
|
||||||
common_parse:
|
common_parse:
|
||||||
call parse_line_contents
|
call parse_line_contents
|
||||||
@ -159,9 +159,9 @@ parser:
|
|||||||
shl eax,16
|
shl eax,16
|
||||||
push eax
|
push eax
|
||||||
inc [blocks_stack]
|
inc [blocks_stack]
|
||||||
cmp bx,if_directive-assembler
|
cmp bx,if_directive-instruction_handler
|
||||||
je parse_if
|
je parse_if
|
||||||
cmp bx,while_directive-assembler
|
cmp bx,while_directive-instruction_handler
|
||||||
je parse_while
|
je parse_while
|
||||||
call parse_line_contents
|
call parse_line_contents
|
||||||
jmp parse_next_line
|
jmp parse_next_line
|
||||||
@ -188,11 +188,11 @@ parser:
|
|||||||
lods byte [esi]
|
lods byte [esi]
|
||||||
or al,al
|
or al,al
|
||||||
jnz extra_characters_on_line
|
jnz extra_characters_on_line
|
||||||
cmp bx,if_directive-assembler
|
cmp bx,if_directive-instruction_handler
|
||||||
je close_parsing_block
|
je close_parsing_block
|
||||||
cmp bx,repeat_directive-assembler
|
cmp bx,repeat_directive-instruction_handler
|
||||||
je close_parsing_block
|
je close_parsing_block
|
||||||
cmp bx,while_directive-assembler
|
cmp bx,while_directive-instruction_handler
|
||||||
je close_parsing_block
|
je close_parsing_block
|
||||||
jmp parse_next_line
|
jmp parse_next_line
|
||||||
close_parsing_block:
|
close_parsing_block:
|
||||||
@ -202,7 +202,7 @@ parser:
|
|||||||
jne unexpected_instruction
|
jne unexpected_instruction
|
||||||
dec [blocks_stack]
|
dec [blocks_stack]
|
||||||
pop eax edx
|
pop eax edx
|
||||||
cmp bx,if_directive-assembler
|
cmp bx,if_directive-instruction_handler
|
||||||
jne parse_next_line
|
jne parse_next_line
|
||||||
test al,1100b
|
test al,1100b
|
||||||
jz parse_next_line
|
jz parse_next_line
|
||||||
@ -251,7 +251,7 @@ parser:
|
|||||||
parse_else:
|
parse_else:
|
||||||
cmp [blocks_stack],0
|
cmp [blocks_stack],0
|
||||||
je unexpected_instruction
|
je unexpected_instruction
|
||||||
cmp word [esp+2],if_directive-assembler
|
cmp word [esp+2],if_directive-instruction_handler
|
||||||
jne unexpected_instruction
|
jne unexpected_instruction
|
||||||
lods byte [esi]
|
lods byte [esi]
|
||||||
or al,al
|
or al,al
|
||||||
@ -264,7 +264,7 @@ parser:
|
|||||||
call get_instruction
|
call get_instruction
|
||||||
jc extra_characters_on_line
|
jc extra_characters_on_line
|
||||||
pop edi
|
pop edi
|
||||||
cmp bx,if_directive-assembler
|
cmp bx,if_directive-instruction_handler
|
||||||
jne extra_characters_on_line
|
jne extra_characters_on_line
|
||||||
test byte [esp],100b
|
test byte [esp],100b
|
||||||
jnz skip_true_condition_else
|
jnz skip_true_condition_else
|
||||||
@ -311,15 +311,15 @@ parser:
|
|||||||
lea esi,[esi+ecx+1]
|
lea esi,[esi+ecx+1]
|
||||||
jmp skip_parsing_line
|
jmp skip_parsing_line
|
||||||
skip_parsing_instruction:
|
skip_parsing_instruction:
|
||||||
cmp bx,if_directive-assembler
|
cmp bx,if_directive-instruction_handler
|
||||||
je skip_parsing_block
|
je skip_parsing_block
|
||||||
cmp bx,repeat_directive-assembler
|
cmp bx,repeat_directive-instruction_handler
|
||||||
je skip_parsing_block
|
je skip_parsing_block
|
||||||
cmp bx,while_directive-assembler
|
cmp bx,while_directive-instruction_handler
|
||||||
je skip_parsing_block
|
je skip_parsing_block
|
||||||
cmp bx,end_directive-assembler
|
cmp bx,end_directive-instruction_handler
|
||||||
je skip_parsing_end_directive
|
je skip_parsing_end_directive
|
||||||
cmp bx,else_directive-assembler
|
cmp bx,else_directive-instruction_handler
|
||||||
je skip_parsing_else
|
je skip_parsing_else
|
||||||
skip_parsing_contents:
|
skip_parsing_contents:
|
||||||
lods byte [esi]
|
lods byte [esi]
|
||||||
@ -369,11 +369,11 @@ parser:
|
|||||||
lods byte [esi]
|
lods byte [esi]
|
||||||
or al,al
|
or al,al
|
||||||
jnz extra_characters_on_line
|
jnz extra_characters_on_line
|
||||||
cmp bx,if_directive-assembler
|
cmp bx,if_directive-instruction_handler
|
||||||
je close_skip_parsing_block
|
je close_skip_parsing_block
|
||||||
cmp bx,repeat_directive-assembler
|
cmp bx,repeat_directive-instruction_handler
|
||||||
je close_skip_parsing_block
|
je close_skip_parsing_block
|
||||||
cmp bx,while_directive-assembler
|
cmp bx,while_directive-instruction_handler
|
||||||
je close_skip_parsing_block
|
je close_skip_parsing_block
|
||||||
jmp skip_parsing
|
jmp skip_parsing
|
||||||
close_skip_parsing_block:
|
close_skip_parsing_block:
|
||||||
@ -385,7 +385,7 @@ parser:
|
|||||||
pop eax edx
|
pop eax edx
|
||||||
test al,1
|
test al,1
|
||||||
jz skip_parsing
|
jz skip_parsing
|
||||||
cmp bx,if_directive-assembler
|
cmp bx,if_directive-instruction_handler
|
||||||
jne parse_next_line
|
jne parse_next_line
|
||||||
test al,10000b
|
test al,10000b
|
||||||
jz parse_next_line
|
jz parse_next_line
|
||||||
@ -394,15 +394,15 @@ parser:
|
|||||||
mov eax,[current_line]
|
mov eax,[current_line]
|
||||||
stos dword [edi]
|
stos dword [edi]
|
||||||
inc [parsed_lines]
|
inc [parsed_lines]
|
||||||
mov eax,1 + (end_directive-assembler) shl 8
|
mov eax,1 + (end_directive-instruction_handler) shl 8
|
||||||
stos dword [edi]
|
stos dword [edi]
|
||||||
mov eax,1 + (if_directive-assembler) shl 8
|
mov eax,1 + (if_directive-instruction_handler) shl 8
|
||||||
stos dword [edi]
|
stos dword [edi]
|
||||||
jmp parse_next_line
|
jmp parse_next_line
|
||||||
skip_parsing_else:
|
skip_parsing_else:
|
||||||
cmp [blocks_stack],0
|
cmp [blocks_stack],0
|
||||||
je unexpected_instruction
|
je unexpected_instruction
|
||||||
cmp word [esp+2],if_directive-assembler
|
cmp word [esp+2],if_directive-instruction_handler
|
||||||
jne unexpected_instruction
|
jne unexpected_instruction
|
||||||
lods byte [esi]
|
lods byte [esi]
|
||||||
or al,al
|
or al,al
|
||||||
@ -415,7 +415,7 @@ parser:
|
|||||||
call get_instruction
|
call get_instruction
|
||||||
jc extra_characters_on_line
|
jc extra_characters_on_line
|
||||||
pop edi
|
pop edi
|
||||||
cmp bx,if_directive-assembler
|
cmp bx,if_directive-instruction_handler
|
||||||
jne extra_characters_on_line
|
jne extra_characters_on_line
|
||||||
mov al,[esp]
|
mov al,[esp]
|
||||||
test al,1
|
test al,1
|
||||||
@ -432,7 +432,7 @@ parser:
|
|||||||
stos dword [edi]
|
stos dword [edi]
|
||||||
inc [parsed_lines]
|
inc [parsed_lines]
|
||||||
parse_else_if:
|
parse_else_if:
|
||||||
mov eax,1 + (if_directive-assembler) shl 8
|
mov eax,1 + (if_directive-instruction_handler) shl 8
|
||||||
stos dword [edi]
|
stos dword [edi]
|
||||||
jmp parse_if
|
jmp parse_if
|
||||||
skip_parsing_pure_else:
|
skip_parsing_pure_else:
|
||||||
@ -451,21 +451,21 @@ parser:
|
|||||||
parse_line_contents:
|
parse_line_contents:
|
||||||
mov [parenthesis_stack],0
|
mov [parenthesis_stack],0
|
||||||
parse_instruction_arguments:
|
parse_instruction_arguments:
|
||||||
cmp bx,prefix_instruction-assembler
|
cmp bx,prefix_instruction-instruction_handler
|
||||||
je allow_embedded_instruction
|
je allow_embedded_instruction
|
||||||
cmp bx,times_directive-assembler
|
cmp bx,times_directive-instruction_handler
|
||||||
je parse_times_directive
|
je parse_times_directive
|
||||||
cmp bx,end_directive-assembler
|
cmp bx,end_directive-instruction_handler
|
||||||
je allow_embedded_instruction
|
je allow_embedded_instruction
|
||||||
cmp bx,label_directive-assembler
|
cmp bx,label_directive-instruction_handler
|
||||||
je parse_label_directive
|
je parse_label_directive
|
||||||
cmp bx,segment_directive-assembler
|
cmp bx,segment_directive-instruction_handler
|
||||||
je parse_label_directive
|
je parse_label_directive
|
||||||
cmp bx,load_directive-assembler
|
cmp bx,load_directive-instruction_handler
|
||||||
je parse_load_directive
|
je parse_load_directive
|
||||||
cmp bx,extrn_directive-assembler
|
cmp bx,extrn_directive-instruction_handler
|
||||||
je parse_extrn_directive
|
je parse_extrn_directive
|
||||||
cmp bx,public_directive-assembler
|
cmp bx,public_directive-instruction_handler
|
||||||
je parse_public_directive
|
je parse_public_directive
|
||||||
parse_argument:
|
parse_argument:
|
||||||
lea eax,[edi+100h]
|
lea eax,[edi+100h]
|
||||||
|
@ -37,6 +37,7 @@ preprocessor:
|
|||||||
mov eax,[additional_memory_end]
|
mov eax,[additional_memory_end]
|
||||||
mov [labels_list],eax
|
mov [labels_list],eax
|
||||||
xor eax,eax
|
xor eax,eax
|
||||||
|
mov [source_start],eax
|
||||||
mov [display_buffer],eax
|
mov [display_buffer],eax
|
||||||
mov [hash_tree],eax
|
mov [hash_tree],eax
|
||||||
mov [macro_status],al
|
mov [macro_status],al
|
||||||
@ -375,12 +376,14 @@ get_directive:
|
|||||||
ret
|
ret
|
||||||
directive_ok:
|
directive_ok:
|
||||||
lea esi,[edx+ebp]
|
lea esi,[edx+ebp]
|
||||||
|
call directive_handler
|
||||||
|
directive_handler:
|
||||||
|
pop ecx
|
||||||
movzx eax,word [ebx]
|
movzx eax,word [ebx]
|
||||||
add eax,preprocessor
|
add eax,ecx
|
||||||
clc
|
clc
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
preprocess_line:
|
preprocess_line:
|
||||||
mov eax,esp
|
mov eax,esp
|
||||||
sub eax,100h
|
sub eax,100h
|
||||||
@ -756,24 +759,20 @@ add_preprocessor_symbol:
|
|||||||
define_fix_constant:
|
define_fix_constant:
|
||||||
add edx,5
|
add edx,5
|
||||||
add esi,2
|
add esi,2
|
||||||
push edx esi
|
push edx
|
||||||
mov esi,edx
|
|
||||||
call skip_parameters
|
|
||||||
xchg esi,[esp]
|
|
||||||
mov ch,11b
|
mov ch,11b
|
||||||
jmp define_preprocessor_constant
|
jmp define_preprocessor_constant
|
||||||
define_equ_constant:
|
define_equ_constant:
|
||||||
add esi,3
|
add esi,3
|
||||||
push esi
|
push esi
|
||||||
call process_equ_constants
|
call process_equ_constants
|
||||||
push esi
|
|
||||||
mov esi,[struc_name]
|
mov esi,[struc_name]
|
||||||
mov ch,10b
|
mov ch,10b
|
||||||
define_preprocessor_constant:
|
define_preprocessor_constant:
|
||||||
mov byte [esi-2],3Bh
|
mov byte [esi-2],3Bh
|
||||||
mov cl,[esi-1]
|
mov cl,[esi-1]
|
||||||
call add_preprocessor_symbol
|
call add_preprocessor_symbol
|
||||||
pop esi ebx
|
pop ebx
|
||||||
mov ecx,edi
|
mov ecx,edi
|
||||||
dec ecx
|
dec ecx
|
||||||
sub ecx,ebx
|
sub ecx,ebx
|
||||||
@ -790,34 +789,11 @@ define_symbolic_constant:
|
|||||||
call add_preprocessor_symbol
|
call add_preprocessor_symbol
|
||||||
movzx eax,byte [esi-1]
|
movzx eax,byte [esi-1]
|
||||||
add esi,eax
|
add esi,eax
|
||||||
push esi edx
|
lea ecx,[edi-1]
|
||||||
call skip_parameters
|
sub ecx,esi
|
||||||
pop edx ebx
|
mov [edx+8],esi
|
||||||
lea ecx,[esi-1]
|
|
||||||
sub ecx,ebx
|
|
||||||
mov [edx+8],ebx
|
|
||||||
mov [edx+12],ecx
|
mov [edx+12],ecx
|
||||||
jmp line_preprocessed
|
jmp line_preprocessed
|
||||||
skip_parameters:
|
|
||||||
lods byte [esi]
|
|
||||||
or al,al
|
|
||||||
jz parameters_skipped
|
|
||||||
cmp al,'{'
|
|
||||||
je parameters_skipped
|
|
||||||
cmp al,22h
|
|
||||||
je skip_quoted_parameter
|
|
||||||
cmp al,1Ah
|
|
||||||
jne skip_parameters
|
|
||||||
lods byte [esi]
|
|
||||||
movzx eax,al
|
|
||||||
add esi,eax
|
|
||||||
jmp skip_parameters
|
|
||||||
skip_quoted_parameter:
|
|
||||||
lods dword [esi]
|
|
||||||
add esi,eax
|
|
||||||
jmp skip_parameters
|
|
||||||
parameters_skipped:
|
|
||||||
ret
|
|
||||||
|
|
||||||
define_struc:
|
define_struc:
|
||||||
mov ch,1
|
mov ch,1
|
||||||
@ -959,8 +935,25 @@ define_instant_macro:
|
|||||||
mov [instant_macro_start],esi
|
mov [instant_macro_start],esi
|
||||||
cmp [base_code],10h
|
cmp [base_code],10h
|
||||||
je prepare_match
|
je prepare_match
|
||||||
call skip_parameters
|
skip_parameters:
|
||||||
instant_macro_parameters_skipped:
|
lods byte [esi]
|
||||||
|
or al,al
|
||||||
|
jz parameters_skipped
|
||||||
|
cmp al,'{'
|
||||||
|
je parameters_skipped
|
||||||
|
cmp al,22h
|
||||||
|
je skip_quoted_parameter
|
||||||
|
cmp al,1Ah
|
||||||
|
jne skip_parameters
|
||||||
|
lods byte [esi]
|
||||||
|
movzx eax,al
|
||||||
|
add esi,eax
|
||||||
|
jmp skip_parameters
|
||||||
|
skip_quoted_parameter:
|
||||||
|
lods dword [esi]
|
||||||
|
add esi,eax
|
||||||
|
jmp skip_parameters
|
||||||
|
parameters_skipped:
|
||||||
dec esi
|
dec esi
|
||||||
mov [parameters_end],esi
|
mov [parameters_end],esi
|
||||||
lods byte [esi]
|
lods byte [esi]
|
||||||
@ -973,7 +966,7 @@ prepare_match:
|
|||||||
call skip_pattern
|
call skip_pattern
|
||||||
mov [value_type],80h+10b
|
mov [value_type],80h+10b
|
||||||
call process_symbolic_constants
|
call process_symbolic_constants
|
||||||
jmp instant_macro_parameters_skipped
|
jmp parameters_skipped
|
||||||
skip_pattern:
|
skip_pattern:
|
||||||
lods byte [esi]
|
lods byte [esi]
|
||||||
or al,al
|
or al,al
|
||||||
@ -1522,15 +1515,9 @@ use_instant_macro:
|
|||||||
jae do_match
|
jae do_match
|
||||||
cmp [base_code],0
|
cmp [base_code],0
|
||||||
jne do_irp
|
jne do_irp
|
||||||
call get_number
|
call precalculate_value
|
||||||
jc invalid_value
|
cmp eax,0
|
||||||
or ebp,ebp
|
jl value_out_of_range
|
||||||
jnz invalid_value
|
|
||||||
cmp dword [edi+4],0
|
|
||||||
jne value_out_of_range
|
|
||||||
mov eax,[edi]
|
|
||||||
cmp eax,80000000h
|
|
||||||
jae value_out_of_range
|
|
||||||
push [free_additional_memory]
|
push [free_additional_memory]
|
||||||
push [macro_symbols]
|
push [macro_symbols]
|
||||||
mov [macro_symbols],0
|
mov [macro_symbols],0
|
||||||
@ -1558,16 +1545,10 @@ use_instant_macro:
|
|||||||
cmp al,':'
|
cmp al,':'
|
||||||
jne rept_counter_added
|
jne rept_counter_added
|
||||||
push edx
|
push edx
|
||||||
call get_number
|
call precalculate_value
|
||||||
jc invalid_value
|
|
||||||
or ebp,ebp
|
|
||||||
jnz invalid_value
|
|
||||||
cmp dword [edi+4],0
|
|
||||||
jne value_out_of_range
|
|
||||||
mov eax,[edi]
|
|
||||||
mov edx,eax
|
mov edx,eax
|
||||||
add edx,[counter_limit]
|
add edx,[counter_limit]
|
||||||
jc value_out_of_range
|
jo value_out_of_range
|
||||||
pop edx
|
pop edx
|
||||||
mov dword [edx+8],eax
|
mov dword [edx+8],eax
|
||||||
lods byte [esi]
|
lods byte [esi]
|
||||||
@ -1606,6 +1587,21 @@ use_instant_macro:
|
|||||||
mov ecx,edx
|
mov ecx,edx
|
||||||
call move_data
|
call move_data
|
||||||
jmp initial_preprocessing_ok
|
jmp initial_preprocessing_ok
|
||||||
|
precalculate_value:
|
||||||
|
push edi
|
||||||
|
call convert_expression
|
||||||
|
mov al,')'
|
||||||
|
stosb
|
||||||
|
push esi
|
||||||
|
mov esi,[esp+4]
|
||||||
|
call calculate_expression
|
||||||
|
mov eax,[edi]
|
||||||
|
mov ecx,[edi+4]
|
||||||
|
pop esi edi
|
||||||
|
cdq
|
||||||
|
cmp edx,ecx
|
||||||
|
jne value_out_of_range
|
||||||
|
ret
|
||||||
do_irp:
|
do_irp:
|
||||||
cmp byte [esi],1Ah
|
cmp byte [esi],1Ah
|
||||||
jne invalid_macro_arguments
|
jne invalid_macro_arguments
|
||||||
@ -1977,10 +1973,10 @@ process_macro:
|
|||||||
replace_macro_symbol:
|
replace_macro_symbol:
|
||||||
pop edi eax
|
pop edi eax
|
||||||
mov ecx,[edx+8]
|
mov ecx,[edx+8]
|
||||||
and ecx,not 80000000h
|
|
||||||
mov edx,[edx+12]
|
mov edx,[edx+12]
|
||||||
or edx,edx
|
or edx,edx
|
||||||
jz replace_macro_counter
|
jz replace_macro_counter
|
||||||
|
and ecx,not 80000000h
|
||||||
xchg esi,edx
|
xchg esi,edx
|
||||||
call move_data
|
call move_data
|
||||||
mov esi,edx
|
mov esi,edx
|
||||||
@ -2057,6 +2053,12 @@ process_macro:
|
|||||||
inc edi
|
inc edi
|
||||||
jmp multiple_macro_counter_values
|
jmp multiple_macro_counter_values
|
||||||
store_number_symbol:
|
store_number_symbol:
|
||||||
|
cmp ecx,0
|
||||||
|
jge numer_symbol_sign_ok
|
||||||
|
neg ecx
|
||||||
|
mov al,'-'
|
||||||
|
stos byte [edi]
|
||||||
|
numer_symbol_sign_ok:
|
||||||
mov ax,1Ah
|
mov ax,1Ah
|
||||||
stos word [edi]
|
stos word [edi]
|
||||||
push edi
|
push edi
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -33,7 +33,7 @@
|
|||||||
; cannot simply be copied and put under another distribution licence
|
; cannot simply be copied and put under another distribution licence
|
||||||
; (including the GNU Public Licence).
|
; (including the GNU Public Licence).
|
||||||
|
|
||||||
VERSION_STRING equ "1.68"
|
VERSION_STRING equ "1.69.06"
|
||||||
|
|
||||||
VERSION_MAJOR = 1
|
VERSION_MAJOR = 1
|
||||||
VERSION_MINOR = 68
|
VERSION_MINOR = 68
|
||||||
|
@ -44,8 +44,8 @@ simple_instruction_64bit:
|
|||||||
simple_extended_instruction_64bit:
|
simple_extended_instruction_64bit:
|
||||||
cmp [code_type],64
|
cmp [code_type],64
|
||||||
jne illegal_instruction
|
jne illegal_instruction
|
||||||
mov al,48h
|
mov byte [edi],48h
|
||||||
stos byte [edi]
|
inc edi
|
||||||
simple_extended_instruction:
|
simple_extended_instruction:
|
||||||
mov ah,al
|
mov ah,al
|
||||||
mov al,0Fh
|
mov al,0Fh
|
||||||
@ -472,8 +472,8 @@ mov_instruction:
|
|||||||
mov [base_code],0A2h
|
mov [base_code],0A2h
|
||||||
store_mov_address32:
|
store_mov_address32:
|
||||||
call store_instruction_code
|
call store_instruction_code
|
||||||
push instruction_assembled
|
call store_address_32bit_value
|
||||||
jmp store_address_32bit_value
|
jmp instruction_assembled
|
||||||
mov_mem_address16_al:
|
mov_mem_address16_al:
|
||||||
call store_segment_prefix_if_necessary
|
call store_segment_prefix_if_necessary
|
||||||
call address_16bit_prefix
|
call address_16bit_prefix
|
||||||
@ -492,8 +492,8 @@ mov_instruction:
|
|||||||
mov [base_code],0A2h
|
mov [base_code],0A2h
|
||||||
store_mov_address64:
|
store_mov_address64:
|
||||||
call store_instruction_code
|
call store_instruction_code
|
||||||
push instruction_assembled
|
call store_address_64bit_value
|
||||||
jmp store_address_64bit_value
|
jmp instruction_assembled
|
||||||
mov_mem_ax:
|
mov_mem_ax:
|
||||||
test ch,22h
|
test ch,22h
|
||||||
jnz mov_mem_address16_ax
|
jnz mov_mem_address16_ax
|
||||||
@ -3284,6 +3284,7 @@ loop_instruction:
|
|||||||
cmp [code_type],64
|
cmp [code_type],64
|
||||||
jne invalid_operand_size
|
jne invalid_operand_size
|
||||||
call get_address_qword_value
|
call get_address_qword_value
|
||||||
|
call loop_counter_size
|
||||||
call calculate_jump_offset
|
call calculate_jump_offset
|
||||||
mov ecx,edx
|
mov ecx,edx
|
||||||
cdq
|
cdq
|
||||||
@ -4893,6 +4894,7 @@ sse_instruction:
|
|||||||
cmp [immediate_size],-1
|
cmp [immediate_size],-1
|
||||||
jne sse_ok
|
jne sse_ok
|
||||||
call take_additional_xmm0
|
call take_additional_xmm0
|
||||||
|
mov [immediate_size],0
|
||||||
sse_ok:
|
sse_ok:
|
||||||
jmp instruction_ready
|
jmp instruction_ready
|
||||||
sse_xmmreg_xmmreg:
|
sse_xmmreg_xmmreg:
|
||||||
@ -4913,12 +4915,13 @@ sse_instruction:
|
|||||||
cmp [immediate_size],-1
|
cmp [immediate_size],-1
|
||||||
jne sse_nomem_ok
|
jne sse_nomem_ok
|
||||||
call take_additional_xmm0
|
call take_additional_xmm0
|
||||||
|
mov [immediate_size],0
|
||||||
sse_nomem_ok:
|
sse_nomem_ok:
|
||||||
jmp nomem_instruction_ready
|
jmp nomem_instruction_ready
|
||||||
take_additional_xmm0:
|
take_additional_xmm0:
|
||||||
lods byte [esi]
|
cmp byte [esi],','
|
||||||
cmp al,','
|
jne additional_xmm0_ok
|
||||||
jne invalid_operand
|
inc esi
|
||||||
lods byte [esi]
|
lods byte [esi]
|
||||||
cmp al,10h
|
cmp al,10h
|
||||||
jne invalid_operand
|
jne invalid_operand
|
||||||
@ -4928,6 +4931,7 @@ sse_instruction:
|
|||||||
jne invalid_operand_size
|
jne invalid_operand_size
|
||||||
test al,al
|
test al,al
|
||||||
jnz invalid_operand
|
jnz invalid_operand
|
||||||
|
additional_xmm0_ok:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
ps_dq_instruction:
|
ps_dq_instruction:
|
||||||
@ -5483,12 +5487,11 @@ extractps_instruction:
|
|||||||
mov [postbyte_register],al
|
mov [postbyte_register],al
|
||||||
pop ebx
|
pop ebx
|
||||||
mov al,bh
|
mov al,bh
|
||||||
cmp al,8
|
|
||||||
je extractps_store
|
|
||||||
cmp al,4
|
cmp al,4
|
||||||
|
je mmx_nomem_imm8
|
||||||
|
cmp al,8
|
||||||
jne invalid_operand_size
|
jne invalid_operand_size
|
||||||
extractps_store:
|
call operand_64bit
|
||||||
call operand_autodetect
|
|
||||||
jmp mmx_nomem_imm8
|
jmp mmx_nomem_imm8
|
||||||
insertps_instruction:
|
insertps_instruction:
|
||||||
mov [opcode_prefix],66h
|
mov [opcode_prefix],66h
|
||||||
@ -5874,6 +5877,10 @@ movnti_instruction:
|
|||||||
jmp instruction_ready
|
jmp instruction_ready
|
||||||
monitor_instruction:
|
monitor_instruction:
|
||||||
mov [postbyte_register],al
|
mov [postbyte_register],al
|
||||||
|
cmp byte [esi],0
|
||||||
|
je monitor_instruction_store
|
||||||
|
cmp byte [esi],0Fh
|
||||||
|
je monitor_instruction_store
|
||||||
lods byte [esi]
|
lods byte [esi]
|
||||||
call get_size_operator
|
call get_size_operator
|
||||||
cmp al,10h
|
cmp al,10h
|
||||||
@ -6074,6 +6081,7 @@ crc32_instruction:
|
|||||||
cmp al,','
|
cmp al,','
|
||||||
jne invalid_operand
|
jne invalid_operand
|
||||||
mov [operand_size],0
|
mov [operand_size],0
|
||||||
|
call operand_64bit
|
||||||
lods byte [esi]
|
lods byte [esi]
|
||||||
call get_size_operator
|
call get_size_operator
|
||||||
cmp al,10h
|
cmp al,10h
|
||||||
@ -6105,6 +6113,57 @@ crc32_instruction:
|
|||||||
popcnt_instruction:
|
popcnt_instruction:
|
||||||
mov [opcode_prefix],0F3h
|
mov [opcode_prefix],0F3h
|
||||||
jmp bs_instruction
|
jmp bs_instruction
|
||||||
|
movbe_instruction:
|
||||||
|
mov [supplemental_code],al
|
||||||
|
mov [extended_code],38h
|
||||||
|
mov [base_code],0Fh
|
||||||
|
lods byte [esi]
|
||||||
|
call get_size_operator
|
||||||
|
cmp al,'['
|
||||||
|
je movbe_mem
|
||||||
|
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,10h
|
||||||
|
; je movbe_reg_reg
|
||||||
|
cmp al,'['
|
||||||
|
jne invalid_argument
|
||||||
|
call get_address
|
||||||
|
mov al,[operand_size]
|
||||||
|
call operand_autodetect
|
||||||
|
jmp instruction_ready
|
||||||
|
; movbe_reg_reg:
|
||||||
|
; lods byte [esi]
|
||||||
|
; call convert_register
|
||||||
|
; mov bl,al
|
||||||
|
; mov al,ah
|
||||||
|
; call operand_autodetect
|
||||||
|
; jmp nomem_instruction_ready
|
||||||
|
movbe_mem:
|
||||||
|
inc [supplemental_code]
|
||||||
|
call get_address
|
||||||
|
push edx ebx ecx
|
||||||
|
lods byte [esi]
|
||||||
|
cmp al,','
|
||||||
|
jne invalid_operand
|
||||||
|
lods byte [esi]
|
||||||
|
call get_size_operator
|
||||||
|
cmp al,10h
|
||||||
|
jne invalid_operand
|
||||||
|
lods byte [esi]
|
||||||
|
call convert_register
|
||||||
|
mov [postbyte_register],al
|
||||||
|
pop ecx ebx edx
|
||||||
|
mov al,[operand_size]
|
||||||
|
call operand_autodetect
|
||||||
|
jmp instruction_ready
|
||||||
|
|
||||||
simple_vmx_instruction:
|
simple_vmx_instruction:
|
||||||
mov ah,al
|
mov ah,al
|
||||||
@ -6705,15 +6764,6 @@ store_instruction:
|
|||||||
cmp [code_type],64
|
cmp [code_type],64
|
||||||
jne invalid_address_size
|
jne invalid_address_size
|
||||||
address_prefix_ok:
|
address_prefix_ok:
|
||||||
test bh,1000b
|
|
||||||
jz base_code_ok
|
|
||||||
or [rex_prefix],41h
|
|
||||||
base_code_ok:
|
|
||||||
test bl,1000b
|
|
||||||
jz index_code_ok
|
|
||||||
or [rex_prefix],42h
|
|
||||||
index_code_ok:
|
|
||||||
call store_instruction_code
|
|
||||||
cmp bl,44h
|
cmp bl,44h
|
||||||
je swap_base_with_index
|
je swap_base_with_index
|
||||||
cmp bl,84h
|
cmp bl,84h
|
||||||
@ -6727,6 +6777,15 @@ store_instruction:
|
|||||||
cmp bl,84h
|
cmp bl,84h
|
||||||
je invalid_address
|
je invalid_address
|
||||||
base_register_ok:
|
base_register_ok:
|
||||||
|
test bh,1000b
|
||||||
|
jz base_code_ok
|
||||||
|
or [rex_prefix],41h
|
||||||
|
base_code_ok:
|
||||||
|
test bl,1000b
|
||||||
|
jz index_code_ok
|
||||||
|
or [rex_prefix],42h
|
||||||
|
index_code_ok:
|
||||||
|
call store_instruction_code
|
||||||
or cl,cl
|
or cl,cl
|
||||||
jz only_base_register
|
jz only_base_register
|
||||||
base_and_index:
|
base_and_index:
|
||||||
|
Loading…
Reference in New Issue
Block a user