Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Программный код в Visual С + + для этой же задачи представлен в листинге 3.3.
Листинг 3.3. Пример кода на Visual С++с использованием цикла while
int Х1[10] = {12, 90, -6, 30, 22, 10, 22, 89, -0, 47};
int Counter = 0;
int 1X1 = 0;
int SXI = sizeof (XI);
while (XI[1X1] != 0)
{
Counter++;
if (1X1 == SXI) break;
IX1++;
};
if (Counter == SXI)
Counter = 0;

Вариант решения задачи на языке ассемблера (листинг 3.4) выглядит на первый взгляд более сложным, чем в предыдущих примерах.
Листинг 3.4. Пример кода на ассемблере с использованием цикла while
.386
.model flat, stdcall
.data
XI DD 2, -23, 5, 9, -1, 0, 9, 3
SXl DD $-Xl
IXl DD 1
Counter DD 0
. code
start:
push EBX
mov ECX, 0
mov EBX, offset XI
mov EDX, DWORD PTR SXl
shr EDX, 2
AGAIN:
mov EAX, DWORD PTR [EBX]
cmp EAX, 0
je RUNOUT
inc ECX
cmp ECX, EDX
je RUNOUT
add EBX, 4
jmp AGAIN
RUNOUT:
cmp ECX, EDX
jne SET_CNT
xor ECX, ECX
SET_CNT:
mov DWORD PTR Counter, ECX
pop EBX
end start

Необходимо сделать несколько важных замечаний. Первое касается использования регистров. При работе с внешними программами и модулями на языках высокого уровня всегда старайтесь сохранить регистры ЕВХ, языках высокого уровня всегда старайтесь сохранить регистры ЕВХ, ЕВР, E S I и EDI в стеке. Что касается остальных регистров (ЕАХ, ЕСХ и EDX), ТО ВЫ можете использовать их по своему усмотрению.

Второе замечание касается работы с массивами данных и строками на ассемблере. В операционной системе Windows для доступа к таким данным всегда используются 32-разрядные переменные, которые хранят адреса массивов или строк. Поэтому для осуществления доступа к элементам массива xi необходимо поместить его адрес в регистр ЕВХ:
mov ЕВХ, offset XI

Для работы нам понадобится и размер массива, который мы сохраним в регистре EDX:
mov EDX, DWORD PTR SXI

Счетчик ненулевых элементов мы поместим в регистр ЕСХ. Так как каждый элемент массива занимает в памяти 4 байта (двойное слово), то для доступа к последующему элементу мы используем команду
add ЕВХ, 4

В нашей задаче присутствуют две структуры высокого уровня — цикл while и оператор условия if. Цикл while реализован с помощью трех операторов:
mov ЕАХ, DWORD PTR [ЕВХ]
cmp ЕАХ, О
je RUNOUT,
а условие if — операторами:
cmp ЕСХ, EDX
j е RUNOUT


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru