Meine ersten Schritte in ASM

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Meine ersten Schritte in ASM

Beitrag von 125 »

Hi,
Da PB inline ASM unterstützt hab ich mir heute 2 Tutorials durchgelesen und versucht mal nen Hello World zu schreiben aber Irgendwie gibt es nur Kryptographische Zeichen aus in deren Mitte meine Message steht :(
Was mach ich Falsch?

Code: Alles auswählen

mov dx,Nachricht

mov ah,09h
int 21h
mov ah,4Ch
int 21h 
 
Nachricht db "Hello World"
plz help

mfg
125
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Re: Meine ersten Schritte in ASM

Beitrag von traumatic »

Schöner DOS-Code, den du da ausgegraben hast
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Hab zwar keine Ahnung von ASM, aber dein Code ist 16-Bittig
>> mov dx,Nachricht
In 32-Bit haben die Register 3 Buchstabern also edx

>> int 21h
Hier wird ein Interrupt aufgerufen (zur Darstellung wahrscheinlich), dies funktioniert unter Windows natürlich nicht.

Hab selber auch schon nach ASM-Büchern und Tutorials Ausschau gehalten, und mußte feststellen, das der größte Teil sich auf 16-Bit DOS Programmierung beschränkt.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Hm äähmm das sieht ziemlich alt aus.... :roll:
Ich dachte in PB kann man diese DOS oder BIOS-Interrupts nicht mit Asm verwenden, oder? :? Und das Nachricht DB "Hello..." ist mir nicht ganz geheuer... Bei dir funktioniert der Code?

Mfg,
AndyX
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

Ich kann nicht behaupten, das ich ASM beherrsche, deshalb schonmal Entschuldigung
im voraus. Mit meinen wenigen Kenntnissen würde ich behaupten, "go the api-way!"...

Code: Alles auswählen

!extrn _GetStdHandle@4
!extrn _WriteConsoleA@20

CopyMemory(@"Hello World!", @msg.b, 12)

handle.l : written.b

PUSH dword -11
CALL _GetStdHandle@4
MOV [v_handle], eax

PUSH dword 0
PUSH v_written
PUSH dword 12
PUSH v_msg
PUSH dword [v_handle]
CALL _WriteConsoleA@20
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Jo, das ist ein 16 Bit Code der erste Interrupt gibt die Nachricht aus DX aus. Der zweite sollte das Programm beenden. Wollt auch nur erstmal nen paar grundebefehle drauf bekommen und so :)

Weiß wer was an dem 16 bit Code falsch ist?

Werd mir gleich mal die Api in ASM angucken :)

//Edit2: Will auch erstmal das ASM nicht in PB verwenden sondern rein ASM writen damit ich damit überhaupt erstmal was anfangen kann :)

//Edit: @AndyX nein der Code geht nicht der gibt außer der Message noch ne ganze Menge cryptischer zeichen aus :(

//Edit3: So gibt er weniger Cryptische Zeichen aus und schreibt 2 Sätze mit Absatz aber auch noch nicht sauber :(

Code: Alles auswählen

use16
mov dx,Nachricht

mov ah,09h
int 21h
mov ah,4Ch
int 21h 
 
Nachricht db "Hello World",10,13,"Hello World2$"
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

@traumatic
Wenn ich mich aber nicht irre, funktioniert Code von 125 auch ohne dos, inrterrupt 12h ist doch software-bios interrupt ?
Also es musste im Realmode auch finktionieren.
Stimmt das oder habe ich da grade Unsinn verzapft ?
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

ne ist ja Interrupt 21 ist der Dos Interrupt ;) Also nicht PB Kompatibel aber aus irgendeinem Grund gibt der Code(mit Fasm compiliert) zusätzlich zu meinem String noch Crypt. Zeichen aus...
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

Interrupt 21 ist der Dos Interrupt
dann stimmt das nicht, was ich geschrieben habe.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Doch das stimmt, weil du da vom Interrupt 12(!) schreibst.

Hier mal eine Übersicht über die ersten paar Interrupts:
INT 00 - CPU-generated - DIVIDE ERROR
INT 01 - CPU-generated - SINGLE STEP; (80386+) - DEBUGGING EXCEPTIONS
INT 02 - external hardware - NON-MASKABLE INTERRUPT
INT 03 - CPU-generated - BREAKPOINT
INT 04 - CPU-generated - INTO DETECTED OVERFLOW
INT 05 - PRINT SCREEN; CPU-generated (80186+) - BOUND RANGE EXCEEDED
INT 06 - CPU-generated (80286+) - INVALID OPCODE
INT 07 - CPU-generated (80286+) - PROCESSOR EXTENSION NOT AVAILABLE

INT 08 - IRQ0 - SYSTEM TIMER; CPU-generated (80286+)
INT 09 - IRQ1 - KEYBOARD DATA READY; CPU-generated (80286,80386)
INT 0A - IRQ2 - LPT2/EGA,VGA/IRQ9; CPU-generated (80286+)
INT 0B - IRQ3 - SERIAL COMMUNICATIONS (COM2); CPU-generated (80286+)
INT 0C - IRQ4 - SERIAL COMMUNICATIONS (COM1); CPU-generated (80286+)
INT 0D - IRQ5 - FIXED DISK/LPT2/reserved; CPU-generated (80286+)
INT 0E - IRQ6 - DISKETTE CONTROLLER; CPU-generated (80386+)

INT 0F - IRQ7 - PARALLEL PRINTER
INT 10 - VIDEO; CPU-generated (80286+)
INT 11 - BIOS - GET EQUIPMENT LIST; CPU-generated (80486+)
INT 12 - BIOS - GET MEMORY SIZE
INT 13 - DISK
INT 14 - SERIAL
INT 15 - CASSETTE
INT 16 - KEYBOARD
INT 17 - PRINTER
INT 18 - DISKLESS BOOT HOOK (START CASSETTE BASIC)
INT 19 - SYSTEM - BOOTSTRAP LOADER
INT 1A - TIME
INT 1B - KEYBOARD - CONTROL-BREAK HANDLER

INT 1C - TIME - SYSTEM TIMER TICK
INT 1D - SYSTEM DATA - VIDEO PARAMETER TABLES
INT 1E - SYSTEM DATA - DISKETTE PARAMETERS
INT 1F - SYSTEM DATA - 8x8 GRAPHICS FONT
INT 20 - DOS 1+ - TERMINATE PROGRAM
INT 21 - DOS 1+ - Function Calls
INT 22 - DOS 1+ - PROGRAM TERMINATION ADDRESS
INT 23 - DOS 1+ - CONTROL-C/CONTROL-BREAK HANDLER
INT 24 - DOS 1+ - CRITICAL ERROR HANDLER
INT 25 - DOS 1+ - ABSOLUTE DISK READ

INT 26 - DOS 1+ - ABSOLUTE DISK WRITE
INT 27 - DOS 1+ - TERMINATE AND STAY RESIDENT
INT 28 - DOS 2+ - DOS IDLE INTERRUPT
INT 29 - DOS 2+ - FAST CONSOLE OUTPUT
Die legendäre Referenz in Sachen 16-Bit-Assembler von Ralf Brown: http://www-2.cs.cmu.edu/afs/cs.cmu.edu/ ... f/pub/WWW/

@125:
Müsstest du nicht statt

Code: Alles auswählen

mov dx, Nachricht
eher

Code: Alles auswählen

lea dx, Nachricht
schreiben? Sonst würde er doch eigendlich nur die ersten zwei Bytes (?) aus der Variabel Nachricht laden und ausgeben!?
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Antworten