Bash - 如何计算指令数量?

psi*_*lia 3 regex linux bash assembly build

我有许多*.s程序集文件.我想计算它们包含多少指令.例如,要计算我所做的所有mul指令:

cat *.s | grep -P '\t'"mul" | wc -l
Run Code Online (Sandbox Code Playgroud)

这给了我所有mul指令的复合数.

我想有一个输出像:

mul: 893
add: 12054
sub: 2356
...
Run Code Online (Sandbox Code Playgroud)

问题是目标平台不支持指令表.每个目标平台都有不同的指令集.必须从现有的程序集文件中推导出支持的指令.我可以在没有Perl/Python代工厂的情况下在Bash中完成吗?

Bre*_*wey 5

你可以像这样得到所有这些:

grep -hP '^[ \t]+[a-z]*' *.s | sed 's/^[ \t]\+\([a-z]*\).*/\1/' | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)

编辑:我将其更改为使用SiegeX提供的示例.

输出:

1 call
6 mov
1 push
1 ret
2 syscall
2 xor
Run Code Online (Sandbox Code Playgroud)


Sie*_*geX 5

假设你的指令都是通过使用空格从其他代码缩进(tab是正常的),那么这个awk1-liner将起作用:

awk '/^[[:space:]]+/{a[$1]++}END{for(op in a){print op,a[op]}}' /path/to/*.s
Run Code Online (Sandbox Code Playgroud)

输入

$ cat asm.s
section .text
global _start, write
write:
  mov al,1 ;write syscall
  syscall
  ret
_start:
  mov rax,0x0a68732f6e69622f
  push rax
  xor rax,rax
  mov rsi,rsp
  mov rdi,1
  mov rdx,8
  call write

exit: ; just exit not a function
  xor rax,rax
  mov rax,60
  syscall
Run Code Online (Sandbox Code Playgroud)

产量

$ awk '/^[[:space:]]+/{a[$1]++}END{for(op in a){print op,a[op]}}' ./*.s
push 1
xor 2
ret 1
mov 6
syscall 2
call 1
Run Code Online (Sandbox Code Playgroud)