grep -q
полезно с этой целью.
то же использование awk
:
string="unix-bash 2389"
character="@"
printf '%s' "$string" | awk -vc="$character" '{ if (gsub(c, "")) { print "Found" } else { print "Not Found" } }'
Вывод:
Не Найденный
string="unix-bash 2389"
character="-"
printf '%s' "$string" | awk -vc="$character" '{ if (gsub(c, "")) { print "Found" } else { print "Not Found" } }'
Вывод:
Найденный
Первоисточник: http://unstableme.blogspot.com/2008/06/bash-search-letter-in-string-awk.html
В Windows мы использовали Apache для обслуживания наших файлов. Здесь Мы очень довольны такой настройкой.
> gcc -g -c test.c
> objdump -d -M intel -S test.o
test.o: file format elf32-i386
Disassembly of section .text:
00000000 <main>:
#include <stdio.h>
int main(void)
{
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 83 e4 f0 and esp,0xfffffff0
6: 83 ec 10 sub esp,0x10
puts("test");
9: c7 04 24 00 00 00 00 mov DWORD PTR [esp],0x0
10: e8 fc ff ff ff call 11 <main+0x11>
return 0;
15: b8 00 00 00 00 mov eax,0x0
}
1a: c9 leave
1b: c3 ret
Использование -S
переключение на GCC в системах на базе x86 по умолчанию создает дамп синтаксиса AT&T, который можно указать с помощью переключателя -masm = att
, например:
gcc -S -masm=att code.c
Если вы хотите создать дамп в синтаксисе Intel, вы можете используйте переключатель -masm = intel
, например так:
gcc -S -masm=intel code.c
(Оба создают дампы code.c
с различным синтаксисом, в файл code.s
] соответственно)
Чтобы получить аналогичные эффекты с помощью objdump, вам нужно использовать переключатель - disassembler-options =
intel
/ att
, пример (с дампами кода для иллюстрации различий в синтаксисе):
$ objdump -d --disassembler-options=att code.c
080483c4 <main>:
80483c4: 8d 4c 24 04 lea 0x4(%esp),%ecx
80483c8: 83 e4 f0 and $0xfffffff0,%esp
80483cb: ff 71 fc pushl -0x4(%ecx)
80483ce: 55 push %ebp
80483cf: 89 e5 mov %esp,%ebp
80483d1: 51 push %ecx
80483d2: 83 ec 04 sub $0x4,%esp
80483d5: c7 04 24 b0 84 04 08 movl $0x80484b0,(%esp)
80483dc: e8 13 ff ff ff call 80482f4 <puts@plt>
80483e1: b8 00 00 00 00 mov $0x0,%eax
80483e6: 83 c4 04 add $0x4,%esp
80483e9: 59 pop %ecx
80483ea: 5d pop %ebp
80483eb: 8d 61 fc lea -0x4(%ecx),%esp
80483ee: c3 ret
80483ef: 90 nop
и
$ objdump -d --disassembler-options=intel code.c
080483c4 <main>:
80483c4: 8d 4c 24 04 lea ecx,[esp+0x4]
80483c8: 83 e4 f0 and esp,0xfffffff0
80483cb: ff 71 fc push DWORD PTR [ecx-0x4]
80483ce: 55 push ebp
80483cf: 89 e5 mov ebp,esp
80483d1: 51 push ecx
80483d2: 83 ec 04 sub esp,0x4
80483d5: c7 04 24 b0 84 04 08 mov DWORD PTR [esp],0x80484b0
80483dc: e8 13 ff ff ff call 80482f4 <puts@plt>
80483e1: b8 00 00 00 00 mov eax,0x0
80483e6: 83 c4 04 add esp,0x4
80483e9: 59 pop ecx
80483ea: 5d pop ebp
80483eb: 8d 61 fc lea esp,[ecx-0x4]
80483ee: c3 ret
80483ef: 90 nop
Используйте переключатель -S (примечание: заглавная S) для GCC, и он передаст ассемблерный код в файл с расширением .s. Например, следующая команда:
gcc -O2 -S foo.c
оставит сгенерированный код сборки в файле foo.s.
Копируется прямо из http: //www.delorie .com / djgpp / v2faq / faq8_20.html (но удаление ошибочного -c
)
Я хотел бы добавить к этим ответам, что если вы укажете gcc флаг -fverbose-asm
, ассемблер, который он генерирует, будет намного понятнее для чтения.
Вы можете использовать gdb для этого, как objdump.
Этот отрывок взят из http://sources.redhat.com/gdb/current/onlinedocs/gdb_9.html#SEC64
Вот пример, показывающий смешанный исходный код + сборку для Intel x86:
(gdb) disas /m main Dump of assembler code for function main: 5 { 0x08048330 : push %ebp 0x08048331 : mov %esp,%ebp 0x08048333 : sub $0x8,%esp 0x08048336 : and $0xfffffff0,%esp 0x08048339 : sub $0x10,%esp 6 printf ("Hello.\n"); 0x0804833c : movl $0x8048440,(%esp) 0x08048343 : call 0x8048284 7 return 0; 8 } 0x08048348 : mov $0x0,%eax 0x0804834d : leave 0x0804834e : ret End of assembler dump.
Используйте переключатель -S (примечание: заглавная S) для GCC, и он передаст ассемблерный код в файл с расширением .s. Например, следующая команда:
gcc -O2 -S -c foo.c