Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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
<< Назад В начало Далее >> |
|