Асемблерная вставка в С-коде

Тема в разделе "Общие вопросы по С и С++", создана пользователем Breen, 10 июл 2007.

Статус темы:
Закрыта.
  1. Breen

    Breen Гость

    Такая функция см. ниже, компилятор С Minus 32 2.2.2, этот код тестит ОЗУ методом "бегущий ноль", вопрос такой: как связаны переменные объявленные в Си, с ассемблерныым кодом и что такое ebp-4 b ebp-12?
    Копирайт : © 2001 by Stepan Karpenko


    Тест Walking 0's
    */
    long walking0()
    { /* Ни вкоем случае не менять положение переменных !!! */
    /* Новые добавляются с конца !!! */
    unsigned long i;
    unsigned long lastbyte;
    long res;

    res=0;
    lastbyte=_AllMemSize*0x100000;

    for(i=0x100000; i<lastbyte;i++)
    {
    #asm
    mov ebx, dword ptr [ebp-4]
    mov ah, byte ptr fs:[ebx] ; Back up old byte
    mov byte ptr fs:[ebx], 0
    mov al, byte ptr fs:[ebx]
    cmp al, 0
    je Next_Walking_0
    inc dword ptr [ebp-12]
    Next_Walking_0:
    mov byte ptr fs:[ebx], ah ; Restore old byte
    #endasm
    }
    return res;
    }
     
  2. Over

    Over Well-Known Member

    Регистрация:
    4 июл 2007
    Сообщения:
    116
    Симпатии:
    0
    1. Переменные, которые объявляются в функции, доступны всё время, пока эта функция выполняется. Не имеет значения, на каком языке написана вставка. Её можно было бы и на бейсиеке написать, если бы возможность была. Главное, что переменные одинаково доступны из любых таких вставок. Это просто как продолжение той же самой функции, но только на другом языке программирования.
    2. EBP ( от англ. base pointer -- указатель основания, или базы) - это регистр для работы со стэком. Этот регистр служит своего рода реперной точкой, относительно которой вычисляются адреса локальных переменных, размещенных на стеке.
    Теперь рассмотрим программу. Вот эти строки.
    Код (Text):
    unsigned long i;
    unsigned long lastbyte;
    long res;
    В камментах написано, что нельза менять порядок переменных. Почему? Всё потому, что при объявлении они все помещаются в стек и именно в том порядке, в котором объявлены. Сначала в стек ляжет res, затем lastbyte, и последней ляжет переменная i. Смотрим её тип - unsigned long. Размер в байтах этого типа - 4 байта.
    Теперь посмотрим этот код
    Код (Text):
    mov ebx, dword ptr [ebp-4]
    На момент выполнения этой строки в регистре ebp находится адрес байта, следующего за переменной i. А в самой строке выполняется занесение в регистр ebx значения, на 4 байта меньше, чем значение ebp, т.е. указатель на переменную i. Переменная i содержит как значения адреса памяти. В следующей строке содержимое ячейки по адресу из i заносится в регистр AH, чтобы его сохранить. В следующей строке по этому адресу прописывается 0. В следующей строке этот ноль из ячейки копируется в регистр AL. В следующей строке сравниваются значения из ячейки и регистра, если ячейка плохая, то значения не будут равны. Тогда командой inc произойдёт увеличение значения переменной по адресу ebp-12, т.е. переменной res. Она тут выполняет роль индикатора исправности памяти: если всё будет исправно, то она будет = 0, и возвратится в конце программы.
    В последней АСМ-овой строке из регистра AH копируется обратно в ячейку сохранённый байт.
     
  3. Breen

    Breen Гость

    Спасибо за развернутый ответ, прям как учебник читаешь!
    Если не сложно, объясните что есть ptr [] и ptr fs:[], в чем разница?
     
  4. Over

    Over Well-Known Member

    Регистрация:
    4 июл 2007
    Сообщения:
    116
    Симпатии:
    0
    "fs:" Это название сегмента. Если просто ptr[], то тут берётся абсолютный адрес, смещение которого относительно текущего сегмента(сегмента кода) указано в квадратных скобках, а если ptr fs:[], то берётся абслютный адрес, смещение которого указано в скобках, и вычисляться будет относительно начала сегмента fs:
    Советую вам, ув. Breen, обратиться к учебнику по Ассемблеру. Там всё толково написано. В инете их полно везде.
     
Загрузка...
Похожие Темы - Асемблерная вставка коде
  1. Dragon108
    Ответов:
    1
    Просмотров:
    472
  2. vitte
    Ответов:
    8
    Просмотров:
    728
  3. k85
    Ответов:
    2
    Просмотров:
    683
  4. lionk
    Ответов:
    6
    Просмотров:
    761
  5. sasha465
    Ответов:
    2
    Просмотров:
    1.370
Статус темы:
Закрыта.

Поделиться этой страницей