delorie.com/djgpp/faq/converting/asm2s-sed.html
|
search
|
masm to gas converter
From: e93_rog@zafir.e.kth.se (Roine Gustafsson)
Newsgroups: comp.os.msdos.djgpp
Subject: Re: Gnu Assembler Question
Nope, there is a converter.
This is a SED (U**x Stream EDitor) script i saved from a newsposting a
while ago. Havn't tested it myself, tho.
I'm pretty sure there's a SED version for dos.
Here it is:
************************************************************************BEGIN
#
# @(#)as386.sed 1.1 - 86/11/17
#
# This is a sed script which converts Intel 386 assembly code to Unix
# 386 assembly code
#
# This script does not attempt to convert 100% of the ASM386 source code,
# it cannot handle the following constructs:
#
# - strange segmentation schemes
# - data declarations beyond the simple db/dw/dd with simple init list
# - ascii strings
# - structure template addressing (i.e., [ebp].foo)
# - complex expressions (parenthesis and operators other than +-*/)
# - immediate operands that are not simple constants
# - immediate operands with automatically typed memory operands
# - source files in upper case
# - source files with continued lines
#
# A typical way to use this sed script is:
# tr "[A-Z]" "[a-z]" <infile | sed -f this-script >outfile
#
#
# Meaning of labels:
#
# cmpress preserve comments, insert tabs, change '?' to '_'
# control convert '$' control lines
# segment convert segmentation directives
# equate convert 'equ' directives
# data convert db/dw/dd data declarations
# modifer delete address/type modifiers
# registr convert register names
# bincons convert binary/octal/hex conatants
# address regularize addess expressions, delete unneeded tabs
# normliz normalize instruction formats (name-tab-opcode-tab-operands)
# operand swap operands, convert scale/index/base address format
# opcode append b/w to opcode for byte/word register operands
# comment restore preserved comments
:cmpress
h
s/;.*$//
s/[ ]*$/ /
s/[ ][ ]*/ /g
s/\([][)(.,:*/+-]\)/ \1 /g
s/ ? / 0 /g
s/?/_/g
s/[ ][ ]*/ /g
:control
s/^\$[ ]*include ( \([^ .)]*\)[^)]*)/#include "\1.h"/
s/^\$[ ]*eject /; /
/^\$/ s/^/;/
:segment
/ segment e[or] / s/^/ .text ;/
/ segment ro / s/^/ .text ;/
/ segment rw / s/^/ .data ;/
/ ends / s/^/;/
/ stackseg / s/^/;/
s/^[ ]*name \([^ ]*\)/ .file "\1"/
/^[ ]*end / s/^/;/
/^[ ]*assume / s/^/;/
/^[ ]*extrn / s/^/;/
/^[ ]*public [^ ,]* , / {
s/^[ ]*public / .globl /
s/ , .*$//
G
s/\n\([ ]*\)public\([ ]\)[^,]*,/
\1public\2/
P
D
}
s/^[ ]*public / .globl /
s/^[ ]*comm / .comm /
s/^\([^ ][^ ]*\) proc /\1 : ;proc /
/ endp / s/^/;/
s/^\([^ ][^ ]*\) label /\1 : ;label /
s/^[ ]*even / .even /
:equate
s/^\([^ ]*\) equ \(.*\) $/#define : \1 \2 /
:data
s/^[ ]*db / .byte /
s/^\([^ ][^ ]*\) db /\1 : .byte /
s/^[ ]*dw / .value /
s/^\([^ ][^ ]*\) dw /\1 : .value /
s/^[ ]*dd / .long /
s/^\([^ ][^ ]*\) dd /\1 : .long /
/^[ ]*dp / {
s/^[ ]*dp / .value /
s/$/\/selector of dp pointer/
G
s/\n\([ ]*\)dp\([ ]\)/
\1dd\2/
P
D
}
/^\([^ ][^ ]*\) dp / {
s/^\([^ ][^ ]*\) dp /\1: .value /
s/$/\/selector of dp pointer/
G
s/\n[^ ]*\([ ]*\)dp\([ ]\)/
\1dd\2/
P
D
}
s/^\([^ ][^ ]*\) struc /\1 : ;struc /
s/^\([^ ][^ ]*\) record /\1 : ;record /
:modifer
s/ : near / /g
s/ : far / /g
s/ : byte / /g
s/ : word / /g
s/ : dword / /g
s/ short / /g
s/ offset / $/g
/ byte ptr / s/$/?%al?/
s/ byte ptr / /g
/ word ptr / s/$/?%ax?/
s/ word ptr / /g
s/ dword ptr / /g
s/ pword ptr / /g
:registr
s/ e\([abcd]\)x / %e\1x /g
s/ \([abcd]\)\([hlx]\) / %\1\2 /g
s/ e\([ds]\)i / %e\1i /g
s/ \([ds]\)i / %\1i /g
s/ e\([bs]\)p / %e\1p /g
s/ \([bs]\)p / %\1p /g
s/ \([cdefgs]\)s / %\1s /g
:bincons
s/ \([01][01]*\)b / 0b\1 /g
s/ \([0-7][0-7]*\)[oq] / 0\1 /g
s/ \([0-9][0-9a-f]*\)h / 0x\1 /g
t address
:address
s/\[/+/g
/;/ !s/ ] \. / + /g
s/ ]//g
s/ %\([^ ]*\) \* \([248]\) + \([^ %][^ ]*\)/ \3 + %\1 * \2/g
s/ %\([^ ]*\) + \([^ %][^ ]*\)/ \2 + %\1/g
s/ %\([^ ]*\) \* \([248]\) - \([^ %][^ ]*\)/ - \3 + %\1 * \2/g
s/ %\([^ ]*\) - \([^ %][^ ]*\)/ - \2 + %\1/g
s/ + - / - /g
t address
s/ \([)(,*/+-]\)/\1/g
s/\([)(,*/+-]\) /\1/g
s/ :/:/g
s/%\([cdefgs]\)s: /%\1s:/g
:normliz
/: / !s/^\([^ ;#][^ ]*\)/ \1/
/: / !s/^ \([^ +,-]*\)\([+-]\)/ \1 \2/g
/: / !s/^ \([^ +,]*\)+%/ \1 +%/g
/: / s/^\([^ ]*\) \([^ +,-]*\)\([+-]\)/\1 \2 \3/g
/: / s/^\([^ ]*\) \([^ +,]*\)+%/\1 \2 +%/g
s/+%\([^ ,]*\)/(%\1)/g
s/ +/ /g
s/\([:,]\)+/\1/g
:operand
/[.;#]/ !s/^ \([^ ]*\) \([^,]*\),\([^ ]*\)/ \1 \3,\2/
/[.;#]/ !s/^\([^ ][^ ]*\) \([^ ]*\) \([^,]*\),\([^ ]*\)/\1 \2 \4,\3/
/[.;#]/ !s/^ \([^ ]*\) \([0-9][0-9a-fx]*\)\([ ,]\)/ \1 $\2\3/
/[.;#]/ !s/^\([^ ][^ ]*\) \([^ ]*\) \([0-9][0-9a-fx]*\)\([ ,]\)/\1 \2 $\3\4/
s/(%\([^)+*]*\)+%\([^)*]*\)\*\([248]\))/(%\1,%\2,\3)/g
s/(%\([^)+*]*\)\*\([248]\)+%\([^)]*\))/(%\3,%\1,\2)/g
s/(%\([^)+*]*\)+%\([^)]*\))/(%\1,%\2)/g
s/(%\([^)+*]*\)\*\([248]\))/(,%\1,\2)/g
:opcode
/[ ,]%[abcd][hl]/ s/$/?%al?/
/[ ,]%[abcd]x/ s/$/?%ax?/
/[ ,]%[ds]i/ s/$/?%ax?/
/[ ,]%[bs]p/ s/$/?%ax?/
/?%al?/ s/^\([^ ]*\) \([^ ]*\) /\1 \2b /
/?%ax?/ s/^\([^ ]*\) \([^ ]*\) /\1 \2w /
s/^#define:/#define/
s/?%a[xl]?//g
:comment
s/ *$//
x
/;/ !s/^.*$//
s/\([ ]*\);/;\1;/
s/^[^;]*;//
x
G
s/\n//
s/;/\//
************************************************************************END
/Roine