2
# Translate the assembler syntax of i386 assembler programs
3
# Usage: asmsyntax [-no-C] < gas-asm-file > all-asm-file
4
# Warning! All comments are stripped.
10
tmpscript05=sed$$tmp05
11
tmpscript06=sed$$tmp06
12
tmpscript07=sed$$tmp07
13
tmpscript08=sed$$tmp08
14
tmpscript09=sed$$tmp09
15
tmpscript10=sed$$tmp10
16
tmpscript11=sed$$tmp11
17
tmpremove='rm -f $tmpscript01 $tmpscript02 $tmpscript03 $tmpscript04 $tmpscript05 $tmpscript06 $tmpscript07 $tmpscript08 $tmpscript09 $tmpscript10 $tmpscript11'
18
trap "$tmpremove" 1 2 15
20
cat > $tmpscript01 << \EOF
21
# ----------- Strip comments
26
cat > $tmpscript02 << \EOF
27
# ----------- Remove #APP/#NO_APP lines, add a blank line at the end
34
cat > $tmpscript03 << \EOF
35
# ----------- Global symbols depends on ASM_UNDERSCORE
36
s/_\([A-Za-z0-9_:]*\)/C(\1)/
39
cat > $tmpscript04 << \EOF
40
# ----------- Introduce macro syntax for operands
41
s/\([-+0-9A-Z_]\+\)[(]%\(e..\)[)]/MEM_DISP(\2,\1)/g
42
s/[(]%\(e..\)[)]/MEM(\1)/g
43
s/\([-+0-9A-Z_]\+\)[(],%\(e..\),\([0-9]*\)[)]/MEM_DISP_SHINDEX0(\1,\2,\3)/g
44
s/\([-+0-9A-Z_]\+\)[(]%\(e..\),%\(e..\),\([0-9]*\)[)]/MEM_DISP_SHINDEX(\2,\1,\3,\4)/g
45
s/[(]%\(e..\),%\(e..\),\([0-9]*\)[)]/MEM_SHINDEX(\1,\2,\3)/g
46
s/[(]%\(e..\),%\(e..\)[)]/MEM_INDEX(\1,\2)/g
49
cat > $tmpscript05 << \EOF
50
# ----------- Introduce macro syntax for instructions
51
s/\(push\|pop\|mul\|div\|not\|neg\|inc\|dec\|fld\|fstp\)\(.\)\( \+\)\(.*\)$/INSN1(\1,\2 ,\4)/
52
s/\(call\|jmp\|jc\|jnc\|je\|jne\|jz\|jnz\|ja\|jae\|jb\|jbe\|jl\|jge\|js\|jns\)\( \+\)\(.*\)$/INSN1(\1,_ ,\3)/
53
s/\(movs\|movz\)\(.\)l\( \+\)\(.*\)$/INSN2MOVX(\1,\2 ,\4)/
54
s/\(mov\|add\|sub\|adc\|sbb\|xor\|test\|cmp\|rcl\|rcr\|and\|or\|sar\|shr\|shl\|lea\)\(.\)\( \+\)\(.*\)$/INSN2(\1,\2 ,\4)/
55
s/\(shld\|shrd\)\(.\)\( \+\)shcl\( \+\)\(.*\)$/INSN2SHCL(\1,\2 ,\5)/
60
cat > $tmpscript06 << \EOF
61
# ----------- Add size prefixes to memory references' \
62
s/\([(]f[^(,]*,s.*\),MEM/\1,X4 MEM/g
63
s/\([(]f[^(,]*,l.*\),MEM/\1,X8 MEM/g
64
s/\([(][^(,]*,b.*\),MEM/\1,X1 MEM/g
65
s/\([(][^(,]*,w.*\),MEM/\1,X2 MEM/g
66
s/\([(][^(,]*,l.*\),MEM/\1,X4 MEM/g
69
cat > $tmpscript07 << \EOF
70
# ----------- Introduce macro syntax for register names
73
s/\$\([-0-9]*\)/NUM(\1)/g
76
cat > $tmpscript08 << \EOF
77
# ----------- Treat table jumps (hairy)
78
# (Needed because the MSVC inline assembler does not have pseudo-ops.
79
# Note that we transform a table of absolute addresses with 4 bytes
80
# per entry into a table of absolute addresses with 8 bytes per entry.)
81
s/^ \.long \(.*\)$/#ifdef _MSC_VER\
88
s/^ \(INSN1[(]jmp,_[^,]*,\)\*MEM_DISP_SHINDEX0[(]\([^,)]*\),\([^,)]*\),4[)][)]$/#ifdef _MSC_VER\
89
INSN2(lea,l ,MEM_DISP_SHINDEX0(\2+8,\3,8),R(\3))\
90
INSN2(mov,l ,X4 MEM_DISP(\3,-4),R(\3))\
91
INSN1(jmp,_ ,INDIR(R(\3)))\
93
\1INDIR(MEM_DISP_SHINDEX0(\2,\3,4)))\
97
cat > $tmpscript09 << \EOF
98
# ----------- Treat indirect calls
99
s/\(INSN1[(]\(call\|jmp\),_[^,]*,\)\*\(R[(][^)]*[)]\)[)]$/\1INDIR(\3))/
102
cat > $tmpscript10 << \EOF
103
# ----------- Introduce macro syntax for assembler pseudo-ops
106
s/^\([^#]*\)\.align \(.*\)/\1ALIGN(\2)/
107
s/\.globl\( \+\)\(.*\)$/GLOBL(\2)/
108
s/^C(\([A-Za-z0-9_]*\):)/FUNBEGIN(\1)/
109
# The next 5 lines add FUNEND() after each ret followed by an empty line
117
cat > $tmpscript11 << \EOF
118
# ----------- Declare global symbols as functions (we have no variables)
119
s/GLOBL(C(\([A-Za-z0-9_]*\)))$/GLOBL(C(\1))\
120
DECLARE_FUNCTION(\1)/
123
sed -f $tmpscript01 | \
124
sed -f $tmpscript02 | \
126
(if [ $# = 1 -a "x$1" = "x-no-C" ] ; then cat - ; else sed -f $tmpscript03 ; fi) | \
127
sed -f $tmpscript04 | \
128
sed -f $tmpscript05 | \
129
sed -f $tmpscript06 | \
130
sed -f $tmpscript07 | \
131
sed -f $tmpscript08 | \
132
sed -f $tmpscript09 | \
133
sed -f $tmpscript10 | \
134
(if [ $# = 1 -a "x$1" = "x-no-C" ] ; then cat - ; else sed -f $tmpscript11 ; fi)