Разность массивов - 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");
}

Объяснение кода листинга программы

  1. Кодирование на языке ассемблера.
  2. Массивы a и b имеют длину 8 байт и содержат значения, которые должны быть выровнены по границе байта.
  3. В переменной c предполагается хранить результаты вычислений.
  4. После вычислений значения переменных c размещаются в памяти с выравниванием по границе байта.
  5. Центральный процессор выполняет команды ассемблера, которые поступают из стека.
  6. Команда lodsb загружает в альговую регистр байт из памяти по адресу, который указывает переменная esi (a+7).
  7. Команда test al,80h проверяет, является ли старший бит байта равным 1, т.е. является ли байт знаковым.
  8. Команда jz goA выполняется, если старший бит равен 1, т.е. байт является знаковым.
  9. Команда mov al,9 заменяет значение в альговом регистре на 9.
  10. Команда dec byte ptr[esi] уменьшает значение в памяти на 1.
  11. Команда sub al,[ebx] вычитает значение из памяти, которое указывает переменная ebx (b+7), из значения в альговом регистре.
  12. Команда jns goB выполняется, если результат вычитания больше или равен нулю.
  13. Команда add al,10 добавляет к значению в альговом регистре 10.
  14. Команда dec byte ptr[esi] уменьшает значение в памяти на 1.
  15. Команда stosb сохраняет значение в памяти по адресу, который указывает переменная esi (a+7).
  16. Команда dec ebx уменьшает значение в памяти на 1.
  17. Команда loop goC выполняет цикл до тех пор, пока значение переменной ebx больше или равно нулю.
  18. Команда popf восстанавливает значения флагов регистра.
  19. Команда popa восстанавливает значения регистров.
  20. Команда for(i=0; i<8; i++) printf(%d,c[i]); выводит значения массива c через пробел.
  21. Команда printf(\n) выводит символ новой строки.
  22. Команда system(pause) приостанавливает выполнение программы до нажатия клавиши.

Оцени полезность:

5   голосов , оценка 4.4 из 5
Похожие ответы