如何清理格式错误的 x86_64 程序集?
How do I clean up badly-formatted x86_64 assembly?
我有一些程序集要清理。它有全部大写、不一致的间距和大量不需要的换行符。
如何美化这段x86_64汇编代码?
我不知道任何特定于汇编的东西,但你提到的东西可以用 sed 完成。
有几点需要注意:
- 助记符由正则表达式
[A-Za-z0-9]+
匹配。我想不出任何包含其他字符的助记符。
- GPR 的上半部分匹配
r(8|9|1[0-5])(b|w|d)
?
- 字节GPR(不包括r8b-r15b)匹配
[abcd](l|h)|(sp|bp|si|di)l
- 16、32、64位低8位GPR匹配
[er]?([abcd]x|sp|bp|si|di)
- SSE 寄存器可以与正则表达式匹配
xmm(1[0-5]?|[0,2-9])
例如:
# Replace tabs with spaces, then clean up lines of the form "op reg/imm, ..."
# N.B. without the /I option the match will be case-sensitive
sed 's/\t/ /g' <test.s | sed 's/^\s*\([a-z0-9][a-z0-9]*\)\s\s*\([a-z0-9][a-z0-9]*\)\s*,\s*/\t\t, /I'
# Lowercase all GPRs and SSE vector registers"
# I have chosen not to use the more compact patterns above in the interest of readability.
... | sed '/\([^a-z]\)\(AL|AH|AX|EAX|RAX|...XMM0|XMM1|...|XMM15\)/\L/gI'
# Lowercase all instruction mnemonics. More specifically, matches the first thing on every line except when it is followed by a colon.
... | sed '/^\s*\([a-z0-9][a-z0-9]*\)\([^:]\)/\L/I
我有一些程序集要清理。它有全部大写、不一致的间距和大量不需要的换行符。
如何美化这段x86_64汇编代码?
我不知道任何特定于汇编的东西,但你提到的东西可以用 sed 完成。
有几点需要注意:
- 助记符由正则表达式
[A-Za-z0-9]+
匹配。我想不出任何包含其他字符的助记符。 - GPR 的上半部分匹配
r(8|9|1[0-5])(b|w|d)
? - 字节GPR(不包括r8b-r15b)匹配
[abcd](l|h)|(sp|bp|si|di)l
- 16、32、64位低8位GPR匹配
[er]?([abcd]x|sp|bp|si|di)
- SSE 寄存器可以与正则表达式匹配
xmm(1[0-5]?|[0,2-9])
例如:
# Replace tabs with spaces, then clean up lines of the form "op reg/imm, ..."
# N.B. without the /I option the match will be case-sensitive
sed 's/\t/ /g' <test.s | sed 's/^\s*\([a-z0-9][a-z0-9]*\)\s\s*\([a-z0-9][a-z0-9]*\)\s*,\s*/\t\t, /I'
# Lowercase all GPRs and SSE vector registers"
# I have chosen not to use the more compact patterns above in the interest of readability.
... | sed '/\([^a-z]\)\(AL|AH|AX|EAX|RAX|...XMM0|XMM1|...|XMM15\)/\L/gI'
# Lowercase all instruction mnemonics. More specifically, matches the first thing on every line except when it is followed by a colon.
... | sed '/^\s*\([a-z0-9][a-z0-9]*\)\([^:]\)/\L/I