Making x86 Assembly Language Portable
Posted: Wed Jun 15, 2016 10:21 pm
After a lot of development in x86 assembly language and after development efforts of my RealC language (which is basically x86 Assembly with C syntax instead of AT&T or Intel one), I have developed a small project that allows making assembly language much more portable.
For example, I can select automatically the maximum size of the general-purpose registers or machine word size. In can also cautiously treat registers r8 to r15 as memory variables so that most of the code that use them doesn't break but just downgrades to 16 or 32-bit words.
Now I can do something like:
The following is the main and starting skeleton of the idea I have.
Main ''x86 Portable Project'' Page
Main ''x86 Portable Project'' Page
Main ''x86 Portable Project'' Page
Main ''x86 Portable Project'' Page
Text recording for 0000000__x86_Portable.asm
Text recording for 0000000__x86_Portable.asm
Text recording for 0000000__x86_Portable.asm
Text recording for 0000000__x86_Portable.asm
Live source code:
http://www.archefire.org/_PROJECTS_/x86_Portable/v2016-06-15/src/
http://www.archefire.org/_PROJECTS_/x86_Portable/v2016-06-15/src/
http://www.archefire.org/_PROJECTS_/x86_Portable/v2016-06-15/src/
http://www.archefire.org/_PROJECTS_/x86_Portable/v2016-06-15/src/
Here is the source code, although the text recording and the real source code should be used instead because the following will surely get outdated, but I put it just for convenience, to show the initial state of this project:
For example, I can select automatically the maximum size of the general-purpose registers or machine word size. In can also cautiously treat registers r8 to r15 as memory variables so that most of the code that use them doesn't break but just downgrades to 16 or 32-bit words.
Now I can do something like:
Code: Select all
xor wideax,wideax
push wideax
rep inswide
rep outswide
awide rep stoswide ;instead of a32 rep stosd, for Unreal Mode for example
;...etc....
Main ''x86 Portable Project'' Page
Main ''x86 Portable Project'' Page
Main ''x86 Portable Project'' Page
Main ''x86 Portable Project'' Page
Text recording for 0000000__x86_Portable.asm
Text recording for 0000000__x86_Portable.asm
Text recording for 0000000__x86_Portable.asm
Text recording for 0000000__x86_Portable.asm
Live source code:
http://www.archefire.org/_PROJECTS_/x86_Portable/v2016-06-15/src/
http://www.archefire.org/_PROJECTS_/x86_Portable/v2016-06-15/src/
http://www.archefire.org/_PROJECTS_/x86_Portable/v2016-06-15/src/
http://www.archefire.org/_PROJECTS_/x86_Portable/v2016-06-15/src/
Here is the source code, although the text recording and the real source code should be used instead because the following will surely get outdated, but I put it just for convenience, to show the initial state of this project:
Code: Select all
;Set the default mode of x86 Portable to work under
;16-bit Unreal Mode (with access to 4 GB of address space):
;;
%ixdefine _x86_Portable__PLATFORMBITS_ 1632
x86_Portable_START:
;Include a JMP instruction so that we can include this source file
;anywhere in a NASM/YASM assembly source code without causing failures
;due to the embedded data bytes here:
;;
align 16
jmp x86_Portable_END
align 16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%if _x86_Portable__PLATFORMBITS_==16 ;16-bit 8086 code
%ixdefine wideword word
%ixdefine wideword_SZ 2
%ixdefine wideax ax
%ixdefine widecx cx
%ixdefine widedx dx
%ixdefine widebx bx
%ixdefine widesp sp
%ixdefine widebp bp
%ixdefine widesi si
%ixdefine widedi di
%ixdefine _r8 word[__r8]
%ixdefine _r9 word[__r9]
%ixdefine _r10 word[__r10]
%ixdefine _r11 word[__r11]
%ixdefine _r12 word[__r12]
%ixdefine _r13 word[__r13]
%ixdefine _r14 word[__r14]
%ixdefine _r15 word[__r15]
__r8 dw 0
__r9 dw 0
__r10 dw 0
__r11 dw 0
__r12 dw 0
__r13 dw 0
__r14 dw 0
__r15 dw 0
%ixdefine awide
%ixdefine owide
%ixdefine cmpswide cmpsw
%ixdefine lodswide lodsw
%ixdefine stoswide stosw
%ixdefine movswide movsw
%ixdefine inswide insw
%ixdefine outswide outsw
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%elif _x86_Portable__PLATFORMBITS_==1632 ;16-bit Unreal Mode
%ixdefine wideword dword
%ixdefine wideword_SZ 4
%ixdefine wideax eax
%ixdefine widecx ecx
%ixdefine widedx edx
%ixdefine widebx ebx
%ixdefine widesp esp
%ixdefine widebp ebp
%ixdefine widesi esi
%ixdefine widedi edi
%ixdefine _r8 dword[__r8]
%ixdefine _r9 dword[__r9]
%ixdefine _r10 dword[__r10]
%ixdefine _r11 dword[__r11]
%ixdefine _r12 dword[__r12]
%ixdefine _r13 dword[__r13]
%ixdefine _r14 dword[__r14]
%ixdefine _r15 dword[__r15]
__r8 dd 0
__r9 dd 0
__r10 dd 0
__r11 dd 0
__r12 dd 0
__r13 dd 0
__r14 dd 0
__r15 dd 0
%ixdefine awide a32
%ixdefine owide o32
%ixdefine cmpswide cmpsd
%ixdefine lodswide lodsd
%ixdefine stoswide stosd
%ixdefine movswide movsd
%ixdefine inswide insd
%ixdefine outswide outsd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%elif _x86_Portable__PLATFORMBITS_==32 ;32 bit x86 Protected Mode code
%ixdefine wideword dword
%ixdefine wideword_SZ 4
%ixdefine wideax eax
%ixdefine widecx ecx
%ixdefine widedx edx
%ixdefine widebx ebx
%ixdefine widesp esp
%ixdefine widebp ebp
%ixdefine widesi esi
%ixdefine widedi edi
%ixdefine _r8 dword[__r8]
%ixdefine _r9 dword[__r9]
%ixdefine _r10 dword[__r10]
%ixdefine _r11 dword[__r11]
%ixdefine _r12 dword[__r12]
%ixdefine _r13 dword[__r13]
%ixdefine _r14 dword[__r14]
%ixdefine _r15 dword[__r15]
__r8 dd 0
__r9 dd 0
__r10 dd 0
__r11 dd 0
__r12 dd 0
__r13 dd 0
__r14 dd 0
__r15 dd 0
%ixdefine awide
%ixdefine owide
%ixdefine cmpswide cmpsd
%ixdefine lodswide lodsd
%ixdefine stoswide stosd
%ixdefine movswide movsd
%ixdefine inswide insd
%ixdefine outswide outsd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%elif _x86_Portable__PLATFORMBITS_==64 ;64-bit Long Mode code
%ixdefine wideword qword
%ixdefine wideword_SZ 8
%ixdefine wideax rax
%ixdefine widecx rcx
%ixdefine widedx rdx
%ixdefine widebx rbx
%ixdefine widesp rsp
%ixdefine widebp rbp
%ixdefine widesi rsi
%ixdefine widedi rdi
%ixdefine _r8 r8
%ixdefine _r9 r9
%ixdefine _r10 r10
%ixdefine _r11 r11
%ixdefine _r12 r12
%ixdefine _r13 r13
%ixdefine _r14 r14
%ixdefine _r15 r15
%ixdefine awide
%ixdefine owide
%ixdefine cmpswide cmpsq
%ixdefine lodswide lodsq
%ixdefine stoswide stosq
%ixdefine movswide movsq
%ixdefine inswide insd
%ixdefine outswide outsd
%endif
x86_Portable_END:
;EOF