Intel-Assemblercode übersetzen????

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Intel-Assemblercode übersetzen????

Beitragvon fpGUIcoder » 30. Jun 2016, 06:21 Intel-Assemblercode übersetzen????

Hallo,

habe ein Problem, wo ich alleine nicht weiter komme. Ich erhalte laufend Operandenfehler, obwohl ich der Meinung bin, das die Wortbreite der Bezeichner ok ist.

Zum Beislpiel hier:

Code: Alles auswählen
 
  MOV AH,BL
  SHR EBX,3
  AND AH,07h
  MOV pascalvar,EAX
  POP EAX
 


Dass pascalvar hier 4 Byte lang sein muss, weiß ich.

Was ich aber nicht weiß:

- muss die longint oder longword sein?
- oder hängt das mit der Anweisung vorher zusammen? Da wurde ja nur AH, nicht EAX belegt?

Wer kann mir weiter helfen?

Asmmode ist auf Intel eingestellt. Assemblerausgabe sollt ja egal sein, ich weill ja diesen Code übersetzen, in ausführbaren Maschinencode. Meine CPU ist von AMD und versteht 80x86 Code 32 Bittig.

Ich will auch keine sonstigen Prozessorabhängigkeiten, sonst fange ich bei einem Rechnerneukauf oder bei der Portierung auf einen Nachfolgeprozessor wieder von vorne an. Daher soll einfach nur Code dieser Art korrekt übersetzt werden.

Warum klappt das nicht, obwohl pascalvar schon 32 Bit breit ist? Was muss ich noch beachten?

Laut Assemblerbefehlsliste darf ich doch einen Registerinhalt an eine Speicherzelle zuweisen. Warum geht das dann hier nicht?

.
fpGUIcoder
 
Beiträge: 199
Registriert: 20. Okt 2015, 22:13

Beitragvon indianer-frank » 30. Jun 2016, 07:59 Re: Intel-Assemblercode übersetzen????

Vielleicht solltest Du mal genauer beschreiben, was nicht klappt. (Fehlermeldung, Compiler/OS etc). Ich habe keine Probleme, Deinen Schnipsel zu übersetzten:
Code: Alles auswählen
program tasm;
{$ASMmode intel}
procedure test;
var
  pascalvar: longint;
begin
  asm
      MOV AH,BL
      SHR EBX,3
      AND AH,07h
      MOV pascalvar,EAX
      POP EAX
  end;
end;
 
begin
  test;
end.   
 

Code: Alles auswählen
C:\tmp>D:\FPC300\bin\i386-win32\fpc.exe -B TASM.PAS
Free Pascal Compiler version 3.0.0 [2015/11/16] for i386
Copyright (c) 1993-2015 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling TASM.PAS
Linking TASM.exe
19 lines compiled, 0.1 sec, 25184 bytes code, 1252 bytes data
 

Was allerdings das unmotivierte POP EAX soll, ist mir nicht klar.
indianer-frank
 
Beiträge: 134
Registriert: 30. Nov 2008, 21:53

Beitragvon fpGUIcoder » 30. Jun 2016, 16:00 Re: Intel-Assemblercode übersetzen????

Würde ich liebend gerne, wenn ich wüsste, wie. Ich erhalte die Meldung:

filename.pp(911,3) Error: Asm: [mov ???,reg32] invalid combination of opcode and operands

Da ist sicher nur eine ganz ganz simple Option zusätzlich einzustellen, denn sonst wäre der Fehler ja reproduzierbar. Warum kommt also der Fehler bei mir, bei anderen nicht.

Ich kann mir nicht helfen, hier muss irgendeine Zusatzoption eingestellt werden, die standardmäßig nicht gesetzt ist. Sonst würde es ja klappen.

{ASMMODE INTEL} ist eingestellt, als Compileroption im Quellcode, nicht in der IDE

Was muss ich noch tun. Welche Optionen gibt es noch. Offensichtlich ist eine ganz simple OPtion bei mir zu ändern. Aber welche. Ich übersetze von Lazarus 1.6 aus, mit Standardeinstellungen.

Ich würde mehr erklären wenn ich bloß wüsste, wo ich ansetzen muss, dann aber brauchte ich womöglich gar nicht mehr zu fragen.
fpGUIcoder
 
Beiträge: 199
Registriert: 20. Okt 2015, 22:13

Beitragvon Mathias » 30. Jun 2016, 17:11 Re: Intel-Assemblercode übersetzen????

Zeig doch mal die Deklaration von "pacalvar" .
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4343
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon indianer-frank » 1. Jul 2016, 08:01 Re: Intel-Assemblercode übersetzen????

fpGUIcoder hat geschrieben:{ASMMODE INTEL} ist eingestellt, als Compileroption im Quellcode, nicht in der IDE
Nur um sicher zu gehen: Du hast doch hoffentlich
Code: Alles auswählen
{$ASMMODE INTEL} 
im Quellcode stehen, also mit $? Kannst Du denn mein kurzes Programm übersetzen?
indianer-frank
 
Beiträge: 134
Registriert: 30. Nov 2008, 21:53

Beitragvon Nixsager » 29. Okt 2016, 15:27 Re: Intel-Assemblercode übersetzen????

Ich schließe mich mal an die Frage an.

Gibt es eine Übersicht wo man sieht wie alle Assemblerbefehle für FP zu schreiben sind
Weil den Code 'MOV AH ES:0000h' den ich in TP nutze, nimmt FP nicht an.
Ich habe im Code und in der IDE auf Intel-Code gestellt.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon itjump » 29. Okt 2016, 16:05 Re: Intel-Assemblercode übersetzen????

Nixsager hat geschrieben:Ich schließe mich mal an die Frage an.

Gibt es eine Übersicht wo man sieht wie alle Assemblerbefehle für FP zu schreiben sind
Weil den Code 'MOV AH ES:0000h' den ich in TP nutze, nimmt FP nicht an.
Ich habe im Code und in der IDE auf Intel-Code gestellt.

Also, nutzt FPC nicht AT&T als Syntax? Ansonsten habe ich hier mal eine Befehlsliste für Intel Assembler: http://www.jegerlehner.ch/intel/IntelCodeTable.pdf.
Wenn es nicht vom FPC aus sein muss, kann ich auch sehr Flat Assembler empfehlen: https://flatassembler.net/. Sehr einfache und schnelle IDE ist mit dabei. Wenn das nicht geht, schaut nach der AT&T Syntax.
Dieses Forum hier ist Dreck
itjump
 
Beiträge: 179
Registriert: 13. Okt 2016, 17:35
Wohnort: Winnenden

Beitragvon Nixsager » 29. Okt 2016, 16:08 Re: Intel-Assemblercode übersetzen????

itjump hat geschrieben:Also, nutzt FPC nicht AT&T als Syntax?

Das kannst du einstellen ob die AT&T- oder Intel-Variante nutzen willst.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Mathias » 29. Okt 2016, 16:47 Re: Intel-Assemblercode übersetzen????

Von wo kommt der AT&T-Syntax her, bis jetzt kannte ich auf dem PC nur die Syntax von Intel ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4343
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Nixsager » 29. Okt 2016, 16:51 Re: Intel-Assemblercode übersetzen????

Die AT&T-Syntax kommt wohl von den UNIX-Systemen.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
Nixsager
 
Beiträge: 159
Registriert: 8. Okt 2016, 07:38
Wohnort: Polska
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon marcov » 30. Okt 2016, 09:48 Re: Intel-Assemblercode übersetzen????

Mathias hat geschrieben:Von wo kommt der AT&T-Syntax her, bis jetzt kannte ich auf dem PC nur die Syntax von Intel ?


Nein, anfangs gab es auf Linux nur AT&T. Erst etwa 2005 hat GNU AS Intel modi bekommen. Und Linux war anfangs ein reines PC platform.
marcov
 
Beiträge: 1041
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon marcov » 30. Okt 2016, 09:53 Re: Intel-Assemblercode übersetzen????

Nixsager hat geschrieben:Ich schließe mich mal an die Frage an.

Gibt es eine Übersicht wo man sieht wie alle Assemblerbefehle für FP zu schreiben sind
Weil den Code 'MOV AH ES:0000h' den ich in TP nutze, nimmt FP nicht an.
Ich habe im Code und in der IDE auf Intel-Code gestellt.


Ich kann nicht mit TP testen, aber "h" kommen mir unbedingt merkwürdig vor. TP ist Pascal, also nutzt $0000 für hex Zahlen. Auch gibt es immer [] klammer für Speicherreferenzen:

Code: Alles auswählen
{$asmmode intel}
begin
  asm
    mov ah,es:[$0000]
  end;
end.
 


... kompiliert reibungslos. Ist meistens aber zwecklos in go32v2, da wird man eher FS (fuer 1MB dos speicher, braucht man fuer zb Buffer fuer INT Funktionen) oder GS (andere Speicher bereiche wie Vesa VBE). in 32-bit Versionen ist CS=DS=ES= 32-bit Bereich des Programms
marcov
 
Beiträge: 1041
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon Mathias » 30. Okt 2016, 17:17 Re: Intel-Assemblercode übersetzen????

Ich kann nicht mit TP testen, aber "h" kommen mir unbedingt merkwürdig vor.

Im normalen Assembler wird das "h" wird für HEX gebraucht, aber Lazarus lässt auch ein "$" zu.

Diese beiden Zeilen machen das Gleiche.
Code: Alles auswählen
  asm
           Mov     Ax,100h
           Mov     Ax,$100
  end;
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4343
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 3 Gäste

porpoises-institution
accuracy-worried