Участник:GeraltFromRivia/Лекция асм 03

Материал из Викиконспекты
Перейти к: навигация, поиск
   global _start   ;метки бывают локальные и глобальные, они могут пересечься(лок временный функции, видны из этого файла, но не снаружи)
   section  .text   ;секция кода,которая будет выполняться....есть еще секции .data(не для выполнения)

_start:

рассмотрим различные конвекции вызова:

   pascal
   cdecl
   stdcall
   fastcall
   thiscall
   -надо будет почитать про них.....
.rdata(.rodata) секции только для чтения(не выводить, не выполнять)
.bss невыводимые данные из нулей не храняшиеся в exe-шнике(такое сокращение)
ExitProcess функция
  | name
  |     mangling
   если нужно....то пишется call _ExitProcess@q , где q - какое-то десятичное число
   еще может добавиться префикс импортируемый __imp_ , после чего получится такая переменная
   типа указатель на функцию call [__imp__ExitProcess@4]  , это нужно для линкера
       например команду типа
       |_ExitProcess@4
       |jmp [__imp_ ...]
       Функция MessageBox создает, отображает на экране и оперирует окном сообщений - это define, у него может быть два разных аргумента - или А или W...
  давайте напишем на асемблере такую си-шную функцию:
   |int sub (int a, int b)
   |{
   |   return a-b;
   |}
   это быдет выглядеть так:
   |...                                                   
   |push b                                                
   |push a                                                
   |call sub
   ДЗ - записать программу, где ...чего то sub call
   extern "C" int sub(int, int);    - как из плюсов вызвать функцию
   важные регистры, сохраняющие все: ebx, ebp, esi, edi
   не очень важные(их могут в ЛЮБОЕ время испортиться): eax, ecx, edx