Выполнить сборку из Паскаля - PullRequest
1 голос
/ 12 июня 2010

Как выполнить этот код из Pascal:

               MOV EAX, variable1
               PUSH EBX, EAX
               MOV EAX, variable2
               POP EBX
               AND EBX, EAX

Где я определяю аргументы метода / функции в функции (variable1, variable2).

Это школьное задание, я не знаю, почему они заставляют нас делать Pascal / Assembly вместо Java / C ++ или чего-то подобного.

Это не все задание, которое я выполнил, прежде чем мне просто нужна помощь, любая помощь приветствуется, спасибо

Ответы [ 3 ]

1 голос
/ 12 июня 2010

Существует два основных способа вызова явного кода на ассемблере (из любого языка, а не только из Pascal).

Первый способ - записать сборку в отдельный файл и собрать ее с помощью ассемблера.Затем вы должны связать полученный объектный файл с остальной частью вашей программы, и до этого - ваша функция сборки может быть вызвана.Этот метод потребует от вас понимания соглашения о вызовах, используемого вашим компилятором, чтобы все выстраивалось в линию во время компоновки и во время выполнения.

Второй способ - использовать «встроенную сборку», так называемую, потому что вы напишитекод ассемблера прямо в исходном файле вашего обычного языка.Вам нужно будет использовать специфичные для компилятора функции, чтобы объявить блок сборки и заставить его работать с компилятором.Этот метод усложнит перенос вашего кода на другие компиляторы, но вам, возможно, удастся уйти без необходимости понимать соглашение ABI / вызовов для вашей системы.

0 голосов
/ 19 июня 2010

Чтобы уточнить ответ GJ, в Pascal / Delphi вы можете обернуть все это так:

function TestAsmFunction (variable1, variable2: longword): longword; 
assembler; {<- this was neccesary in Turbo Pascal, but not in Delphi}
register; {<- it's the default calling convention anyway. So variable 1=EAX, variable2= EDX}
asm
MOV EAX, variable1        {actually unneccesary (= mov eax, eax)}
PUSH EBX                  
MOV EBX, variable2        {compiles to mov ebx, edx}
AND EAX, EBX              
POP EBX                   
end;                      {Return value is in EAX}
0 голосов
/ 12 июня 2010

Как правило, правила использования регистров (Borland pascal) во внешней процедуре или функции таковы, что вы должны сохранять регистры EDI, ESI, ESP, EBP и EBX, но вы можете свободно изменять EAX, ECX и EDX. регистры.

Итак, ваш ассемблерный код должен выглядеть примерно так:

MOV EAX, variable1        //EAX := variable1          
PUSH EBX                  //save EBX
MOV EBX, variable2        //EBX := variable2        
AND EAX, EBX              //store result to EAX
POP EBX                   //restore EBX

Зависит от соглашения о вызовах функции возвращают аргументы через регистры или стек. Поэтому убедитесь, что вы используете соглашение о вызовах.

...