2010-06-11 4 views
1

Как я могу выполнить этот код с Паскаля:Выполнить сборку из Паскаля

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

Где определить аргументы метода/функции в функции (Variable1, Variable2).

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

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

+0

Для начала: Является ли это TurboPascal? Борланд Паскаль? – EFraim

+1

«Как я могу выполнить этот код из Pascal» Это зависит от компилятора. См. Документацию компилятора. Если компилятор поставляется с IDE (т. Е. Это borland pascal, turbo pascal или delphi), просто нажмите F1. «почему они заставляют нас делать Pascal/Assembly» - потому что паскаль прост в освоении, а ассемблер дает хорошие знания на низком уровне. Java не имеет сборки, а C++ нелегко учиться. – SigTerm

+1

push EBX, EAX? Это новый синтаксис для меня. –

ответ

1

Есть два основных способа вызова явного кода сборки (с любого языка, а не только от Паскаля).

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

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

0

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

Так что ваш код ASM должен выглядеть примерно так:

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 

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

0

Чтобы уточнить ответ ГДж, в Паскаля/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} 
Смежные вопросы