Разность массивов - Assembler
Формулировка задачи:
Надо написать код вычитания, но не смог дописать. Кто может помогите дописать
Т.е. 18379752 - 9534218= ?
unsigned char a[8]={1,8,3,7,9,7,5,2}; unsigned char b[8]={0,9,5,3,4,2,1,8}; unsigned char c[8]={0,0,0,0,0,0,0,0}; main() { _asm{ clc mov ecx, 8 m1: mov al, -123 aas ;sbb ;a[ecx-1] ;b[ecx-1] loop m1 } }
Решение задачи: «Разность массивов»
textual
Листинг программы
unsigned char a[8]={1,8,3,7,9,7,5,2}; unsigned char b[8]={0,9,5,3,4,2,1,8}; unsigned char c[8]; void main(int argc,char* argv[]) { int i; _asm { pusha pushf std lea esi,a+7 lea ebx,b+7 lea edi,c+7 mov ecx,8 goC:lodsb test al,80h jz goA mov al,9 dec byte ptr[esi] goA:sub al,[ebx] jns goB add al,10 dec byte ptr[esi] goB:stosb dec ebx loop goC popf popa } for(i=0; i<8; i++) printf("%d ",c[i]); printf("\n"); system("pause"); }
Объяснение кода листинга программы
- Кодирование на языке ассемблера.
- Массивы a и b имеют длину 8 байт и содержат значения, которые должны быть выровнены по границе байта.
- В переменной c предполагается хранить результаты вычислений.
- После вычислений значения переменных c размещаются в памяти с выравниванием по границе байта.
- Центральный процессор выполняет команды ассемблера, которые поступают из стека.
- Команда lodsb загружает в альговую регистр байт из памяти по адресу, который указывает переменная esi (a+7).
- Команда test al,80h проверяет, является ли старший бит байта равным 1, т.е. является ли байт знаковым.
- Команда jz goA выполняется, если старший бит равен 1, т.е. байт является знаковым.
- Команда mov al,9 заменяет значение в альговом регистре на 9.
- Команда dec byte ptr[esi] уменьшает значение в памяти на 1.
- Команда sub al,[ebx] вычитает значение из памяти, которое указывает переменная ebx (b+7), из значения в альговом регистре.
- Команда jns goB выполняется, если результат вычитания больше или равен нулю.
- Команда add al,10 добавляет к значению в альговом регистре 10.
- Команда dec byte ptr[esi] уменьшает значение в памяти на 1.
- Команда stosb сохраняет значение в памяти по адресу, который указывает переменная esi (a+7).
- Команда dec ebx уменьшает значение в памяти на 1.
- Команда loop goC выполняет цикл до тех пор, пока значение переменной ebx больше или равно нулю.
- Команда popf восстанавливает значения флагов регистра.
- Команда popa восстанавливает значения регистров.
- Команда for(i=0; i<8; i++) printf(
%d
,c[i]); выводит значения массива c через пробел. - Команда printf(
\n
) выводит символ новой строки. - Команда system(
pause
) приостанавливает выполнение программы до нажатия клавиши.