AZelensky
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Написать программу, производящую вычитание чисел произвольной размерности. Числа хранятся в виде массивов типа longint, где 0-й элемент массива - содержит младшие 32 бита числа (с 0-го по 31-й), следующий элемент массива с 32-го по 63-й и т. д.. Ввод-вывод данных чисел осуществлять из двоичных файлов (длина которых соответственно кратна 4-м). Как можно реализовать это? Буду очень благодарен за это. Нужно использовать Pascal с Ассемблерной вставкой Вот то, что есть: 1 --- Код: Program RaznostMassivov; const N=7; var a1:array [1..N] of longint; a2:array [1..N] of longint; c:longint; p:pointer; i:integer; p2:pointer; begin for i:=1 to N do begin writeln('Введите ',i,' элемент массива №1'); readln(a1[i]); end; writeln('Введенный массив №1:'); for i:=1 to N do write(a1[i],' '); writeln; for i:=1 to N do begin writeln('Введите ',i,' элемент массива №2'); readln(a2[i]); end; writeln('Введенный массив №2:'); for i:=1 to N do write(a2[i],' '); writeln; p:=@a1[1]; p2:=@a2[1]; asm mov eax, p mov ebx, p2 mov ecx, 0 @s: mov edx, [ebx] sub [eax], edx jno @m add [eax+4], 1 @m: inc ecx cmp ecx, N je @gg add eax, 4 add ebx, 4 jmp @s @gg: end; end. | 2 --- Код: program LongSum; uses System.SysUtils; const n = 2; type LongValuePart = longint; LongValue = array [0..n-1] of LongValuePart; const partSize = sizeof(LongValuePart); function IntToBin(Value: integer; Digits: integer): string; var i: integer; begin result := ''; for i := 0 to Digits - 1 do if Value and (1 shl i) > 0 then result := '1' + result else result := '0' + result; end; var a, b, c : LongValue; i, carry : longint; begin for i := 0 to n-1 do begin writeln('Введите ', i + 1,' часть числа a'); readln(a[i]); end; writeln('Введенное число a:'); for i := n-1 downto 0 do write(IntToBin(a[i], partSize * 2), ' '); writeln; for i := 0 to n-1 do begin writeln('Введите ', i + 1,' часть числа b'); readln(b[i]); end; writeln('Введенное число b:'); for i := n-1 downto 0 do write(IntToBin(b[i], partSize * 2),' '); writeln; asm xor esi, esi // смещение mov edi, n*partSize // граница смещения xor ecx, ecx // перенесенный разряд с предыдущей части @bgn: cmp esi, edi // проверка условия продолжения цикла jnc @end xor edx, edx // перенесенный разряд с текущей части lea ebx, a // базовый адрес массива a mov eax, [ebx + esi] // eax = a[i] lea ebx, b // базовый адрес массива b sub eax, [ebx + esi] // eax = a[i] + b[i] adc edx, edx // устанавливаем перенесенный разряд с текущей части add eax, ecx // добавляем перенесенный разряд с предыдущей части lea ebx, c // базовый адрес массива c mov [ebx + esi], eax // c[i] = eax (a[i] + b[i]) mov ecx, edx // устанавливаем перенесенный разряд с предыдущей части add esi, partSize // увеличиваем смещение jmp @bgn @end: mov carry, ecx // устанавливаем признак переполнения end; writeln('Результат сложения с = a + b:'); for i := n-1 downto 0 do write(IntToBin(c[i], partSize * 2), ' '); writeln; if carry <> 0 then writeln('Внимание! Произошло переполнение!'); readln; end. |
|