📄 asmi386.sh
字号:
#!/bin/sh# Translate the assembler syntax of i386 assembler programs# Usage: asmsyntax [-no-C] < gas-asm-file > all-asm-file# Warning! All comments are stripped.tmpscript01=sed$$tmp01tmpscript02=sed$$tmp02tmpscript03=sed$$tmp03tmpscript04=sed$$tmp04tmpscript05=sed$$tmp05tmpscript06=sed$$tmp06tmpscript07=sed$$tmp07tmpscript08=sed$$tmp08tmpscript09=sed$$tmp09tmpscript10=sed$$tmp10tmpscript11=sed$$tmp11tmpremove='rm -f $tmpscript01 $tmpscript02 $tmpscript03 $tmpscript04 $tmpscript05 $tmpscript06 $tmpscript07 $tmpscript08 $tmpscript09 $tmpscript10 $tmpscript11'trap "$tmpremove" 1 2 15cat > $tmpscript01 << \EOF# ----------- Strip commentss,# .*,,s,[ ][ ]*$,,EOFcat > $tmpscript02 << \EOF# ----------- Remove #APP/#NO_APP lines, add a blank line at the end/^#APP$/d/^#NO_APP$/d/gcc2_compiled/d/gnu_compiled_c/dEOFcat > $tmpscript03 << \EOF# ----------- Global symbols depends on ASM_UNDERSCOREs/_\([A-Za-z0-9_:]*\)/C(\1)/EOFcat > $tmpscript04 << \EOF# ----------- Introduce macro syntax for operandss/\([-+0-9A-Z_]\+\)[(]%\(e..\)[)]/MEM_DISP(\2,\1)/gs/[(]%\(e..\)[)]/MEM(\1)/gs/\([-+0-9A-Z_]\+\)[(],%\(e..\),\([0-9]*\)[)]/MEM_DISP_SHINDEX0(\1,\2,\3)/gs/\([-+0-9A-Z_]\+\)[(]%\(e..\),%\(e..\),\([0-9]*\)[)]/MEM_DISP_SHINDEX(\2,\1,\3,\4)/gs/[(]%\(e..\),%\(e..\),\([0-9]*\)[)]/MEM_SHINDEX(\1,\2,\3)/gs/[(]%\(e..\),%\(e..\)[)]/MEM_INDEX(\1,\2)/gEOFcat > $tmpscript05 << \EOF# ----------- Introduce macro syntax for instructionss/\(push\|pop\|mul\|div\|not\|neg\|inc\|dec\|fld\|fstp\)\(.\)\( \+\)\(.*\)$/INSN1(\1,\2 ,\4)/s/\(call\|jmp\|jc\|jnc\|je\|jne\|jz\|jnz\|ja\|jae\|jb\|jbe\|jl\|jge\|js\|jns\)\( \+\)\(.*\)$/INSN1(\1,_ ,\3)/s/\(movs\|movz\)\(.\)l\( \+\)\(.*\)$/INSN2MOVX(\1,\2 ,\4)/s/\(mov\|add\|sub\|adc\|sbb\|xor\|test\|cmp\|rcl\|rcr\|and\|or\|sar\|shr\|shl\|lea\)\(.\)\( \+\)\(.*\)$/INSN2(\1,\2 ,\4)/s/\(shld\|shrd\)\(.\)\( \+\)shcl\( \+\)\(.*\)$/INSN2SHCL(\1,\2 ,\5)/s/rep ;/REP/s/repz ;/REPZ/EOFcat > $tmpscript06 << \EOF# ----------- Add size prefixes to memory references' \s/\([(]f[^(,]*,s.*\),MEM/\1,X4 MEM/gs/\([(]f[^(,]*,l.*\),MEM/\1,X8 MEM/gs/\([(][^(,]*,b.*\),MEM/\1,X1 MEM/gs/\([(][^(,]*,w.*\),MEM/\1,X2 MEM/gs/\([(][^(,]*,l.*\),MEM/\1,X4 MEM/gEOFcat > $tmpscript07 << \EOF# ----------- Introduce macro syntax for register namess/%\(e..\)/R(\1)/gs/%\(..\)/R(\1)/gs/\$\([-0-9]*\)/NUM(\1)/gEOFcat > $tmpscript08 << \EOF# ----------- Treat table jumps (hairy)# (Needed because the MSVC inline assembler does not have pseudo-ops.# Note that we transform a table of absolute addresses with 4 bytes# per entry into a table of absolute addresses with 8 bytes per entry.)s/^ \.long \(.*\)$/#ifdef _MSC_VER\ nop\ nop\ push \1\#else\ .long \1\#endif/s/^ \(INSN1[(]jmp,_[^,]*,\)\*MEM_DISP_SHINDEX0[(]\([^,)]*\),\([^,)]*\),4[)][)]$/#ifdef _MSC_VER\ INSN2(lea,l ,MEM_DISP_SHINDEX0(\2+8,\3,8),R(\3))\ INSN2(mov,l ,X4 MEM_DISP(\3,-4),R(\3))\ INSN1(jmp,_ ,INDIR(R(\3)))\#else\ \1INDIR(MEM_DISP_SHINDEX0(\2,\3,4)))\#endif/EOFcat > $tmpscript09 << \EOF# ----------- Treat indirect callss/\(INSN1[(]\(call\|jmp\),_[^,]*,\)\*\(R[(][^)]*[)]\)[)]$/\1INDIR(\3))/EOFcat > $tmpscript10 << \EOF# ----------- Introduce macro syntax for assembler pseudo-ops/\.file\([ ]\+\)/ds/\.text/TEXT()/s/^\([^#]*\)\.align \(.*\)/\1ALIGN(\2)/s/\.globl\( \+\)\(.*\)$/GLOBL(\2)/s/^C(\([A-Za-z0-9_]*\):)/FUNBEGIN(\1)/# The next 5 lines add FUNEND() after each ret followed by an empty line/[ ]ret *$/{n/^$/s/^$/FUNEND()\/}EOFcat > $tmpscript11 << \EOF# ----------- Declare global symbols as functions (we have no variables)s/GLOBL(C(\([A-Za-z0-9_]*\)))$/GLOBL(C(\1))\ DECLARE_FUNCTION(\1)/EOFsed -f $tmpscript01 | \sed -f $tmpscript02 | \(cat - ; echo) | \(if [ $# = 1 -a "x$1" = "x-no-C" ] ; then cat - ; else sed -f $tmpscript03 ; fi) | \sed -f $tmpscript04 | \sed -f $tmpscript05 | \sed -f $tmpscript06 | \sed -f $tmpscript07 | \sed -f $tmpscript08 | \sed -f $tmpscript09 | \sed -f $tmpscript10 | \(if [ $# = 1 -a "x$1" = "x-no-C" ] ; then cat - ; else sed -f $tmpscript11 ; fi)eval "$tmpremove"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -