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.