"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

asm: text ausgeben

Oper8or 09.12.2003 - 22:02 801 4
Posts

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Ich bin mir nicht ganz sicher, ob ich hier im richtigen Forum bin, aber mal schauen.
Ich bin gerade dabei, einen Bootsektor in asm zu codieren. Dieser funktioniert bereits und ruft anschließend folgendes programm auf:

[BITS 16] ; the bios starts out in 16-bit real mode
[ORG 0] ; Data offset = 0

jmp begin

;******************************** DATA SECTION
bootmsg db 'ySYS ver 0.01',13,10,0
rebootmsg db 'Press any key to reboot',13,10,0

;******************************** FUNCTIONS
message: ; Dump ds:si to screen.
lodsb ; load byte at ds:si into al
or al,al ; test if character is 0 (end)
jz done
mov ah,0eh ; put character
mov bx,0007 ; attribute
int 10h ; call BIOS
jmp message
done:
ret

getkey:
mov ah, 0 ; wait for key
int 016h
ret

reboot:
mov si, rebootmsg ; write message
call message
call getkey ; wait for key

db 0EAh ; jump to FFFF:0000 (reboot)

dw 0000h
dw 0FFFFh

;********************************** MAIN PROGRAM
begin:

mov ax,0x7c0 ; BIOS puts us at 0:07C00h, so set DS accordinly
mov ds,ax ; Therefore, we don't have to add 07C00h to all our
cli ; clear interrupts while we setup a stack
mov ax,0x9000 ; this seems to be the typical place for a stack
mov ss,ax
mov sp,0xffff ; let's use the whole segment. Why not? We can :) *hehe*
sti ; put our interrupts back on

mov si,bootmsg ; display the startup message
call message
call reboot

Das Problem: Ich will (wie im Code ersichtlich) einen einfachen Text ausgeben. Das wäre einfach, wenn der DOS-Interrupt (21h) verfügbar wäre. Ist er aber leider nicht. Folglich muss ich mit dem BIOS-Interrupt 10h arbeiten, welcher das ganze aber ziemlich erschwert.
Man sieht im code, dass zuerst per "mov si, bootmsg" der Text im "selbsterstellten Stack" abgespeichert wird. Dann wird die Sprungmarke message aufgerufen. Eigentlich müsste das ganze funktionieren. Tut es aber nicht. Bei Booten wird das programm ganz normal abgearbeitet. Die "Funktionen" getkey und reboot funktionieren einwandfrei. Auch das wechseln in den Graphikmodus ist möglich. Der Text wird einfach nicht ausgegeben.
Irgendwer 'ne Ahnung?
Bearbeitet von Obermotz am 11.12.2003, 19:10

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Schaut nicht so schlecht aus, allerdings kann SI durch den INT 10 verändert werden. Das wird wohl das Problem sein.

MightyMaz

hat nun auch einen Titel
Registered: Feb 2003
Location: .de
Posts: 619
wennst text ausgeben willst must halt auch im textmodus sein also irgendwo ein mov ax,3 int 10h dann hast nen sauberen textscreen.
mit 0eh gibts ja ascii zeichen aus also wird das wohl net im grafik modus gehen. Leider kann ichs ansonsten grad net nachtesten weil er mir einges an Fehlermeldungen ausspuckt u.a. daß si, rebbotsmsg kein legaler operand ist...was fürn assembler verwendest denn ?
Ansonsten würd ich dir empfehlen dann halt keine Variable zu verwenden und alle Zeichen hintereinander einzelnd auf den Screen zu bringen. Es soll ja nur eine einzelne feste Message sein oder ?

Also in dem Stil:

mov ax,3
int 10h

mov al,ascii code zeichen 1
mov ah,0eh
int 10h
mov al, ascii code zeichen 2
int 10h

usw
Bearbeitet von MightyMaz am 09.12.2003, 23:53

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
meine 8086 asm zeiten sind schon ein paar jahre her...
vielleicht helfen die zwei maßnahmen:
CLD vorm LODSB
LEA oder MOV OFFSET statt MOV

und was ringding schon sagte: sichern vom SI

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Ok, thx, werd mal probieren.
Assembler: NASM
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz