Проблема в том, что M (т.е. указатель на переменную) передаётся через стек, а не в регистре:
Код: Выделить всё
.section .text.n_p$program_$$_dm$word$byte$byte$byte,"x"
.balign 16,0x90
.globl P$PROGRAM_$$_DM$WORD$BYTE$BYTE$BYTE
P$PROGRAM_$$_DM$WORD$BYTE$BYTE$BYTE:
# [da.pas]
# [6] asm
pushl %ebp
movl %esp,%ebp
# Var W located in register ax
# Var dwr located in register dl
# Var D located in register ecx
# Var M located at ebp+8, size=OS_32
# [7] mov ax, W;
movw %ax,%ax
# [8] div dwr;
divb %dl
# [12] mov byte [M], ah;
movb %ah,8(%ebp)
# [13] mov byte [D], al;
movb %al,(%ecx)
# [14] end;
leave
ret $4
Одним mov'ом не обойтись, нужно два, вот так работает:
Код: Выделить всё
procedure DM(W: Word; dwr: byte; var D, M: byte); assembler;
asm
mov ax, W;
div dwr;
mov ebx, [M]
mov byte [ebx], ah;
mov byte [D], al;
end;
Код: Выделить всё
C:\data\temp>fpc -al da.pas && da
Free Pascal Compiler version 3.0.0rc1 [2015/08/10] for i386
Copyright (c) 1993-2015 by Florian Klaempfl and others
Note: Switching assembler to default source writing assembler
Target OS: Win32 for i386
Compiling da.pas
Assembling program
Linking da.exe
21 lines compiled, 0.1 sec, 25504 bytes code, 1236 bytes data
1 note(s) issued
D = 6 M = 2
Для успешного написания ассемблерных функций следует либо изучить подробно как действует дефолтная конвенция вызова в паскале, либо использовать какую-то более-менее фиксированную (stdcall, например).