Основы языка ассемблер, страница 2

Для вызова данной функции мы помещаем значение передаваемого регистра в стек и функцией call вызываем созданную функцию. После вызова функции мы корректируем значение регистра указателя стека. Для вывода названия регистра, мы устанавливаем значение используемого в нашей функции указателя строки с названием равное указателю заранее определенной строки с названием конкретного регистра.

Текст программы

#include <iostream>

#include <conio.h>

#include <iomanip>

using namespace std;

char *name;

void print(int what)

{

      char *arr;

      arr = new char[35];

      __asm

      {

            mov edx, what;

            mov esi, arr;

            mov ecx, 32;

m1:         shl edx, 1;

            mov eax, 0;

            adc eax, 48;

            mov [esi], eax;

            add esi, 1;

            loop m1;

            mov [esi],0;

      }

      cout <<setw(5) <<name <<" = " <<setw(5) <<what <<": " <<arr <<endl;

      delete [] arr;

}

int main()

{

      char *ecs="CS";   char *ess="SS";

      char *eds="DS";   char *ees="ES";

      char *efs="FS";   char *egs="GS";

      char *flg="Flags";

      __asm

      {

            xor eax, eax;

            mov esi, ecs

            mov name, esi

            mov ax, cs

            push eax;

            call print;

            add esp, 4;

            mov esi, ess

            mov name, esi

            mov ax, ss

            push eax;

            call print;

            add esp, 4;

            mov esi, eds

            mov name, esi

            mov ax, ds

            push eax;

            call print;

            add esp, 4;

            mov esi, ees

            mov name, esi

            mov ax, es

            push eax;