Ассемблер для Windows

) Delphi



3) Delphi 5.0

Транслятор Delphi также вносит незначительные нюансы в данную проблему. Для сегмента кода нам придется взять название CODE. Из-за того, что строки Паскаль понимает несколько иначе, чем, скажем, Си, в качестве строк мне пришлось взять символьный массив. Впрочем, оператор writeln оказался довольно интеллектуальным и понял все с полуслова. Обратите внимание, что директива stdcall используется и здесь.

{ программа COPYD.PAS, использующая ассемблер путем подключения объектного модуля } program Project2; uses SysUtils; {$APPTYPE CONSOLE} {$L 'copy.OBJ'} procedure COPYSTR(s1,s2 : PChar); stdcall; EXTERNAL; var s1,s2 : array[1..30] of char; begin s2[1] ='P'; s2[2] ='r'; s2[3] ='i'; s2[4] ='v'; s2[5] ='e'; s2[6] ='t'; s2[7] = char(0); COPYSTR(addr(s1[1]),addr(s2[1])) ; Writeln(s1); end.

; файл proc.asm .386P .MODEL FLAT, stdcall PUBLIC COPYSTR ; плоская модель CODE SEGMENT DWORD PUBLIC USE32 'CODE' ; процедура копирования одной строки в другую ; строка, куда копировать [EBP+08Н] ; строка, что копировать [EBP+0CH] ; не учитывает длину строки, куда производится копирование COPYSTR PROC PUSH EBP MOV EBP,ESP MOV ESI,DWORD PTR [EBP+0CH] MOV EDI,DWORD PTR [EBP+08H] L1: MOV AL,BYTE PTR [ESI] MOV BYTE PTR [EDI],AL CMP AL,0 JE L2 INC ESI INC EDI JMP L1 L2: MOV EAX,DWORD PTR [EBP+08H] POP EBP RET 8 COPYSTR ENDP CODE ENDS END



Содержание раздела