Forum: Mikrocontroller und Digitale Elektronik Wer kann mir mir meiner Assembler - Problem helfen ?!


von Olaf Hahn (Gast)


Lesenswert?

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

von Vitali Tscheroun (Gast)


Lesenswert?

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.

von Hannes Lux (Gast)


Lesenswert?

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...

von Johannes Raschke (Gast)


Lesenswert?

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.

von Hannes Lux (Gast)


Lesenswert?

Da hatter Recht...

Bit- & Bytebruch... - ...HanneS...

von Andreas Jäger (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.