Ich habe ein Problem. Ich bin absoluter Assembler - Anfänger und muss
folgende Aufgabe lösen. ich muss eine Datei auslesen und die darin
enthaltenden Anzahl der Wörter ausgeben. Dazu habe ich folgende
Vorlage bekommen.
org 0x0100
;Bitte Matrikelnummerhier eintragen: 0210779
;Variablendeklaration mit Initialisierung
section .data
;Programmausgaben:
meld_busy db "Suche...","$"
meld_exit db "Programm Ende.","$"
error_f_o db "Fehler beim Oeffnen der Datei!","$"
error_f_r db "Fehler beim Lesen der Datei!","$"
error_f_c db "Fehler beim Schliessen der Datei!","$"
meld_res db "Gefundene Zeichen: "
end_res equ $ - 1
db "$"
meld_res_w db "Gefundene Woerter: "
end_res_w equ $ - 1
db "$"
; das Zeichen "$" steht für String-Ende
;Dateiname:
file_name db "texttest.txt",0
;Steuerzeichen
CR_LF db 10, 13, "$"
LF equ 10 ;line feed
CR equ 13 ;carriage return
STRG_Z equ 1ah ;end of file
BLANK_READ equ 1 ;flag
BLANK equ " " ;leerzeichen
TAB equ 9 ;tabulator
;Variablendeklaration ohne Initialisierung
section .bss
buffer_in resb 01000h ;platz für 65536 zeichen
f_handle resw 01h ;platz für 16 Bit handle
count_s resw 01h ;platz für 16 Bit zeichen
count_w resw 01h ;platz für 16 Bit wörter
;Macro für die Ausgabe der Anzahl von Zeichen und Wörter
; Register BX dient als Zeiger auf Speicher
; Speicherbereich %3 und %2 stehen hintereinander s.o.
%macro result 3 ; 3 Argumente
mov ax, [%1] ; 1. Argument: Anzahl
mov cx, 5 ; 5 Stellen ausgeben
lea bx, [%2] ; 2. Argument: Platz für Anzahl
mov di, 10 ; Laden von Basis 10
%%change xor dx, dx ; dx=0
div di ; ax / di
add dl, "0" ; Rest + 30H -> Umwandlung in ASCII
mov [bx], dl ; Rest als Inhalt von Speicherstelle bx
dec bx ; Rücke eine Stelle in bx vor
loop %%change ; wiederhole bis cx=0
lea dx, [%3] ; lade 3. Argument nach dx
call string_out ; gebe meldung aus
%endmacro
;Codedeklaration
section .text
jmp start_
end_ :
lea dx, [meld_exit] ;lade meldung
call string_out ;ausgabe meldung
mov ah, 04Ch ;aufruf funktion exit
xor al, al ;al=0
int 21h ;ausführen des exit
ret
start_ :
call file_open ;aufruf up - datei öffnen
call read_file ;aufruf up - datei lesen
call counting_w ;aufruf up - wörter zählen
result count_s, end_res, meld_res ;aufruf macro - ausgabe
zeichenanzahl
result count_w, end_res_w, meld_res_w ;aufruf macro - ausgabe
wörteranzahl
call end_ ;aufruf up - programmende
string_out :
push dx ;sichern des aktuellen dx
lea dx, [CR_LF] ;anhängen eines CR und LF
mov ah, 09h ;ausgabefunktion
int 21h ;aufruf funktion
pop dx ;dx holen
int 21h ;aufruf funktion
ret ;return
file_open :
mov ah, 3dh ;funktion für datei öffnen
xor al, al ;al=0 -> read only
lea dx, [file_name] ;anfang dateiname
int 21h ;aufruf funktion
jnc open_ok ;kein carry flag -> ok
lea dx, [error_f_o] ;carry flag -> fehlermeldung
call string_out ;ausgabe fehlermeldung
call end_ ;programmende
open_ok mov [f_handle], ax ;register ax enthält akt. handle
ret ;return
read_file :
lea dx, [meld_busy] ;meldung laden
call string_out ;meldung ausgeben
mov ah, 3fh ;funktion datei lesen
mov bx, [f_handle] ;handle bereitstellen
mov cx, 0fffh ;puffer festlegen (4095=fff)
mov dx, buffer_in ;puffer bereitstellen
int 21h ;funktion aufrufen
jc error_r ;wenn carry flag -> fehlermeldung
mov [count_s], ax ;wenn nicht -> gelesen zeichen speichern
jmp close_file ;sprung zu datei schliessen
error_r lea dx, [error_f_r] ;meldung laden
call string_out ;meldung ausgeben
close_file mov ah, 3eh ;funktion datei schliessen
mov bx, [f_handle] ;handle bereitstellen
int 21h ;funktion aufrufen
jnc close_ok ;kein carry flag -> ok
lea dx, [error_f_c] ;carry flag -> fehlermeldung
call string_out ;meldung ausgeben
close_ok ret ;return
; Bearbeiten Sie den Label counting_w
counting_w :
mov word [count_w]
ret
Wie kann ich weiter vorgehen, oder wer kann mir die Aufgabe lösen Das
Label counting_w zu erstellen.
Wäre um jede Hilfe Dankbar
Olaf Hahn
Hallo, ich glaube du bist im falschen Forum,so wie ich das beurteilen kann gibt es diese ganzen Befehle bei den AVR´s nicht,b.z.w.die heissen anders.
Hallo Olaf... Da hatter Recht, was du uns hier vorsetzt, ist Assembler für MS-DOS... Denn da werden Funktionen des DOS-API (INT 21H) aufgerufen (Adresszeiger in DX, Funktionsnummer in Akku, dann INT21h aufrufen)... Versuchs mal mit dem Buch "PC intern" oder der CD dazu, da bekommste unter anderem auch das komplette DOS-API erklärt. Nunja, da musst du schon zu den PC-Freaks gegen, hier geht es um MikroCONTROLLER (auch wenn hier hin und wieder jemand gerne einen PC draus machen möchte)... ;-)) Bit- & Bytebruch... - ...HanneS...
Ich kann Dir zur Lösung Deiner Aufgabe folgende Bücher empfehlen: - Wolfgang Link, Assembler Programmierung, Franzis´ Verlag - Handbuch zu MS-DOS 3.30, darin sind alle DOS Softwareinterrupts genau beschrieben. Außerdem gibt es im Netz eine riesige Interrupttabelle, da wirst Du auch eine Doku zu den Interrupts finden. Also, weiteres Vorgehen: Programm nachvollziehen. Mit Hilfe des DOS-Handbuchs oder Vorlesungsunterlagen herausschreiben, welche DOS-Funktionen benutzt werden, wo Eingabewerte sind und wo Ausgabewerte. Feststellen, daß nach dem Aufruf von read_file der Inhalt der Datei bei der Adresse buffer_in steht. Den Speicherbereich ab dort nach Leerzeichen absuchen, auf ende des benutzten Speichers achten. Anzahl der gefundenen Leerzeichen+1 ausgeben. Falls das nach langem Studium der Vorlesungsunterlagen und Bücher nicht klappt: zum Studentensekretariat gehen, exmatrikulieren. Deine Hausaugaben wird Dir hier übrigens niemand machen, aber bei speziellen Fragen kannst Du auf Hilfe hoffen.
Da hatter Recht... Bit- & Bytebruch... - ...HanneS...
@Vitali > ich glaube du bist im falschen Forum,so wie ich das beurteilen > kann gibt es diese ganzen Befehle bei den AVR´s nicht,b.z.w.die > heissen anders. Es gibt ja auch noch Controller, die keine AVRs sind ;) Auch wenn Olaf hier tatsächlich falsch zu sein scheint. Andreas
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.