[TP - Assembler] zwracanie wyniku, a @result

0

Witam co jest zle w tym kodzie ??

function p_key : boolean; assembler; 
asm 
  mov @result, 0
  mov ah, 1 
  int 16h 
  jz @quit 
  mov @result, 1 
  @quit:
end;
0
function keyhit:boolean;
assembler;
asm
  mov ah,01h
  int 16h
  jz @empty
  mov al,01h {mov al,true}
  jmp @quit
 @empty:
  xor al,al
 @quit:
end;


function keyhit:boolean;
assembler;
asm
  mov ah,01h
  int 16h
  mov al,01h
  jnz @quit
  xor al,al
 @quit:
end;

Do @result możesz sie odwołac, jesli masz blok asm wewnątrz begin/end, czyli w zwyklej funkcji, jeśli zas piszesz funkcję czysto assemblerową, to wyniki:

  • jednobajtowe (boolean/byte/char/shortint/...) są zwracane w AL
  • dwubajtowe (int/word/moze coś jeszcze) są zwracane w AX
  • czterobajtowe (longint/pointer/...) są zwracane w parze DX:AX (dx -starsze słowo)

sam sprawdz:

function one(b:byte):char; {boolean/shortint/1..2}
assembler;
asm
  mov al,[b]
end;

function two(i:integer):word;
assembler;
asm
  mov ax,[i]
end;

function four(l:longint):pointer;
assembler;
asm
  mov dx,word ptr [l+2]
  mov ax,word ptr [l+0]   {mov ax,word ptr [l]}
end;

Delphi jest 32-bitowe, wiec 4-bajtowe wartosci zwracane są w EAX, natomiast dopiero 8-bajtowe w parze EDX:EAX, poza tym nie ma róźnicy (poza brakiem konieczności uzycia słówka 'assembler')

0

No zrobiłm tak jak mowiłes ale nie wiem dlaczego zawsze zwraca wartość 0 czyli false

 if (p_key=true) then klaw(cyfra) else p_mouse(x,y,b);

funkcja :

function p_key : boolean;
Begin 
  Asm 
    mov @result, 0 
    mov ah, 1 
    int 16h 
    jz @quit 
    mov @result, 1 
  @quit: 
  end;
end;

Robiłem tez tak samo jak ty

function keyhit:boolean;
assembler;
asm
  mov ah,01h
  int 16h
  mov al,01h
  jnz @quit
  xor al,al
@quit:
end; 

ale to samo :(

A mi działa :]

0

A mi działa, więc masz coś zwalone poza tą funkcją ;]

// może nie używasz t.pascala ?

0

Juz zrobiłem musiałem troche zmienic ifka :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1