Gast
#61156
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