Консультация № 138119
27.05.2008, 17:39
0.00 руб.
0 2 2
Как написать процедуру на ассемблере такого типа:
Procedure xxx(x,y:integer);
begin
x:=x+y;
end;
как оформить такую процедуру я знаю а вот как ей передать параметры нет(((
побывал через стек командами Push...Pop не получаться ... программа дает ошибку или просто закрываться(((

Обсуждение

Неизвестный
28.05.2008, 07:27
общий
это ответ
Здравствуйте, Делий Роман !

Мне кажется, что эта процедура ошибочна, так как возврат результата в одном из параметров не самый красивый вариант.
Вероятно, здесь имеет место подпрограмма-функция (тогда xxx:= x+y;) или же параметры являются указателями на x и y.

function xxx(x,y:integer):longint;
begin
xxx:= x+y;
end;

Возможный вариант смотрите в приложении; TurboPascal генерирует не совсем корректный код для такой функции.

Приложение:
ASSUME cs:code, ds:data, ss:stk;-----------------------------------------------data SEGMENTDB ‘blablabla :)‘data ENDS;-----------------------------------------------code SEGMENTentry_point:mov ax,SEG datamov ds,axmov ax,32767push axmov ax,32767push axcall xxx_func ;7FFFh + 7FFFh = 0000FFFEhmov ax,-32768push axmov ax,-32768push axcall xxx_func ;8000h + 8000h = FFFF0000hmov ax,4C00hINT 21h;------------------------------------------------;подпрограмма сложения двух чисел типа integer;ВОЗВРАТ: dx:ax - результат сложения типа longint;------------------------------------------------xxx_func PROC near;стековые параметрыy equ WORD PTR [bp+4]x equ WORD PTR [bp+6]arg_size = 2*2push bpmov bp,sp;xxx_func:=x+yxor dx,dxmov ax,xadd ax,yjnc exitmov dx,0FFFFhexit:pop bpret arg_sizexxx_func ENDPcode ENDSstk SEGMENT stackDB 200h DUP(?)stk ENDS;TurboPascal;function xxx_func(x,y:integer):longint;;begin;xxx_func:= x+y;;end;;...;mov ax,[bp+6];add ax,[bp+4];cwd ;копирует значение старшего бита регистра AX на все биты регистра DX;...;тестирование;xxx_func(32767,32767) = -2;xxx_func(-32768,-32768) = 0END entry_point
давно
Старший Модератор
31795
6196
28.05.2008, 23:27
общий
это ответ
Здравствуйте, Делий Роман !

Смотрите приложение.
В программе есть две процедуры ХХХр(чистый паскаль) и ХХХа(почти чистых ассемблер, т.к. формирование пролога и эпилога процедуры берет на себя компилятор).
Процедура ХХХр вызывается с помощью ассемблера, а ХХХа - паскалем.
Вот и вся передача данных через стек.
Удачи!

Приложение:
var a,b:integer; {процедура на паскале}procedure XXXp(c,d:integer); begin writeln(c+d); end; {процедура на ассемблере}procedure XXXa(c,d:integer);assembler; asm mov ax,[bp+4] add ax,[bp+6] xor cx,cx mov bx,10 {получаем младшую цифру и запоминаем её в стеке}@@01: xor dx,dx div bx push dx inc cx or ax,ax jnz @@01 {выводим цифры в нужном порядке}@@02: pop ax or al,30h int 29h loop @@02 {ожидаем нажатие любой клавиши} xor ax,ax int 16h end;begin a:=10; b:=20; {вызываем процедуру на ассемблере} XXXa(a,b); {вызываем процедуру на паскале} asm mov ax,a push ax mov ax,b push ax call xxxP end;end.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа