Связь pascal and asm, модуль числа - Assembler
Формулировка задачи:
Нужно в матрице поменять отрицательные числа на положительные (взять модуль). Сначала сделал для одномерного массива. Вроде все правильно пишу - брать модуль не хочет (neg). Изменять нужно в ассемблерной вставке, на паскале написан только ввод и вывод массива, ну и подключение функции с вставкой asm. Просьба помочь, заранее спасибо.
Program labasm_3; uses crt; type tmas1=array [1..5] of integer; var mas1:tmas1; mas2:tmas1; mas3:tmas1; i:integer; function Sradd( p,p2:pointer; j:integer):Integer; begin asm { int 3 ; ®в«*¤Є*} xor dx, dx lds si, p les di, p2 mov cx, j { Є®ЇЁа㥬 j б«®ў Ё§ mas1 ў mas3 } rep movsw lds si, p les di, p2 neg di mov cx, j end; end; Procedure Vvod; begin TextColor(Green); Writeln('‡*¤**ЁҐ:'); writeln('Ќ*©вЁ Їа®Ё§ўЁ¤Ґ*ЁҐ ¤ўге ®¤*®¬Ґа*ле ¬*ббЁў®ў'); writeln; TextColor(2); Writeln('‚ўҐ¤ЁвҐ 5 Ґ«Ґ¬*Ґв®ў'); TextColor(yellow); for i:=1 to 5 do begin read(Mas1[i]); writeln('Mas1[',i,'] =',Mas1[i]); end; Readln; end; begin clrscr; Vvod; { end;} Sradd(@mas1,@mas3,5); TextColor(Blue); writeln('Mas3_rez:'); for i:=1 to 5 do write(' ',Mas3[i]); readln; end.
Решение задачи: «Связь pascal and asm, модуль числа»
textual
Листинг программы
asm mov ax,j rcl ax,1 jnc @1 neg j @1: end;
Объяснение кода листинга программы
В данном коде происходит следующее:
- Переменная
j
содержит число, которое необходимо умножить на 10. - Используя операцию сдвига
rcl ax,1
, значение переменнойj
смещается на один разряд влево, при этом старший бит устанавливается в ноль. - Если старший бит равен нулю (jnc @1), то число положительное и его можно умножать на 10.
- Если старший бит не равен нулю, то число отрицательное и его необходимо инвертировать (neg j).
- После выполнения операции умножения на 10, результат сохраняется в переменной
ax
. - Код завершается командой
end;
.