запутанный C / asm "Привет, мир!"программа, я не понимаю - PullRequest
0 голосов
/ 21 июня 2010

почему следующий код выводит "Hello, world!"(в «моей» системе)?

        .file   "test.c"
.globl main
        .data
        .align 32
        .type   main, @object
        .size   main, 56
main:
        .value  3816
        .value  0
        .value  18432
        .value  27749
        .value  28524
        .value  8236
        .value  28535
        .value  27762
        .value  8548
        .value  -29942
        .value  9228
        .value  7305
        .value  -17884
        .value  14
        .value  0
        .value  20818
        .value  443
        .value  0
        .value  21248
        .value  1208
        .value  0
        .value  -32000
        .value  1260
        .value  -32563
        .value  -15229
        .value  23312
        .value  -16335
        .value  -28477

также, что означает .value и как оно будет переведено в машинный код?

Ответы [ 4 ]

5 голосов
/ 21 июня 2010

Я собрал его, а затем разобрал, и вот что я получил.Я не запускал его, потому что я знаю лучше, чем запускать случайные фрагменты языка ассемблера, который я нахожу в сети.

Код начинается с перехода к коду печати:

00000000 <main>:
   0:   e8 0e 00 00 00          call   13 <main+0x13>

Затем следует ASCII для «Hello, World! \ N»:

   5:   48 65 6c 6c 6f 2c 20
   c:   77 6f 72 6c 64 21 0a

Код, к которому переходили в первой инструкции:

  13:   8b 0c 24                mov    (%esp),%ecx
  16:   89 1c 24                mov    %ebx,(%esp)
  19:   ba 0e 00 00 00          mov    $0xe,%edx
  1e:   52                      push   %edx
  1f:   51                      push   %ecx
  20:   bb 01 00 00 00          mov    $0x1,%ebx
  25:   53                      push   %ebx
  26:   b8 04 00 00 00          mov    $0x4,%eax
  2b:   83 ec 04                sub    $0x4,%esp
  2e:   cd 80                   int    $0x80
  30:   83 c4 10                add    $0x10,%esp
  33:   5b                      pop    %ebx
  34:   31 c0                   xor    %eax,%eax
  36:   c3                      ret
  37:   90                      nop

FWIW, метод, который использовался для вставки вашегокод в файл, foo.S, затем:

gcc -S foo.S
objdump -D foo.o
2 голосов
/ 21 июня 2010

Это похоже на ассемблерный код. Вот некоторые ключевые моменты, на которые стоит обратить внимание:

  1. ". Globl main": эта директива указывает ассемблеру сделать символ main видимым за пределами этого файла сборки.
  2. "main:": это создает символ main, который компоновщик знает для поиска при компоновке
  3. ". Value": это заставляет ассемблер выдавать байт с соответствующим значением.

Учитывая это, оставшийся трюк заключается в преобразовании выбрасываемых байтов в инструкции, которым они соответствуют. Это можно сделать с помощью карты кодов операций в «Руководстве разработчика программного обеспечения для архитектуры Intel 64 и IA-32: том 2B», которое можно получить по адресу здесь

0 голосов
/ 21 июня 2010

.value не переводится в машинный код. Это директива ассемблера.

Директива .globl экспортирует основной символ. Это типично, потому что основной должен быть публично видим для компоновщика. Директива .data начинает сегмент данных исполняемого файла, а затем объявляет main как объект размера 56, так как существует 28 операторов .value, каждое из которых представляет 16-битное значение.

Числа, указанные после .value, являются необработанными двоичными значениями, представляющими уже переведенные инструкции. Для дальнейшего определения их значения потребуется знание вашей операционной системы и процессора.

Надеюсь, это поможет.

0 голосов
/ 21 июня 2010

.value - это необработанные данные памяти.Они сами являются машинными кодами.Файл содержит программу не в удобочитаемой для человека мнемонике, а в виде десятичных чисел (выглядит как двухбайтовые числа со знаком). Если вы хотите увидеть программу как читаемый код, скомпилируйте ее и используйте любой дизассемблер.

...