Intel-Assemblercode übersetzen????

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
fpGUIcoder
Beiträge: 199
Registriert: Di 20. Okt 2015, 23:13

Intel-Assemblercode übersetzen????

Beitrag von fpGUIcoder »

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?

.

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Intel-Assemblercode übersetzen????

Beitrag von indianer-frank »

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.

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

Re: Intel-Assemblercode übersetzen????

Beitrag von fpGUIcoder »

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.

Mathias
Beiträge: 6165
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Intel-Assemblercode übersetzen????

Beitrag von Mathias »

Zeig doch mal die Deklaration von "pacalvar" .
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Intel-Assemblercode übersetzen????

Beitrag von indianer-frank »

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?

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Intel-Assemblercode übersetzen????

Beitrag von Nixsager »

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!!!

itjump
Beiträge: 179
Registriert: Do 13. Okt 2016, 18:35
Wohnort: Winnenden

Re: Intel-Assemblercode übersetzen????

Beitrag von itjump »

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.

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Intel-Assemblercode übersetzen????

Beitrag von Nixsager »

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!!!

Mathias
Beiträge: 6165
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Intel-Assemblercode übersetzen????

Beitrag von Mathias »

Von wo kommt der AT&T-Syntax her, bis jetzt kannte ich auf dem PC nur die Syntax von Intel ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Intel-Assemblercode übersetzen????

Beitrag von Nixsager »

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!!!

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Intel-Assemblercode übersetzen????

Beitrag von marcov »

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: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Intel-Assemblercode übersetzen????

Beitrag von marcov »

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

Mathias
Beiträge: 6165
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Intel-Assemblercode übersetzen????

Beitrag von Mathias »

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 grün
Mit Java und C/C++ sehe ich rot

Antworten