Problem mit Array



  • Hallo wie kann ich ermitteln wie lange das array wert ist ?
    In C würde ich jetzt strlen nehmen ^^

    mov cx, länge vom array wert <-- Da in CX möchte ich gerne die Länge des Arrays haben aber ich hab 0 Ahnung wie das gehen könnte.

    Hat wer eine Idee ?

    .model small
    .stack 100h
    .data
    
    wert  db 10 dup ("1","2","3") , "$"
    wert2 db 10 dup ("1","1","1") , "$"
    
    .code
    
    start:
    
    		mov ax,@data
    		mov ds,ax
    
    		mov si,offset wert
    		mov di,offset wert2
    
    		mov cx, länge vom array wert
    
    i:	
    		mov al,[si]				
    		mov dl,[di]
    
    		add dl,al
    		sub dl,30h
    
    		mov ah,2h
    		int 21h
    
    		inc si
    		inc di
    
    loop i
    
    		mov ah,4ch
    		int 21h
    
    end start
    


  • Dafür gibt es den SIZEOF-Operator:

    mov cx,SIZEOF wert
    

    cx = Stringlänge + Terminierungszeichen



  • Da bekomme ich diese Fehlermeldung:

    OBJ Datei wird erstellen
    
    Turbo Assembler  Version 4.1  Copyright (c) 1988, 1996 Borland International
    
    Assembling file:   var.ASM
    **Error** var.ASM(23) Undefined symbol: SIZEOF
    Error messages:    1
    Warning messages:  None
    Passes:            1
    Remaining memory:  412k
    
    Datei Linken
    
    Turbo Link  Version 7.1.30.1. Copyright (c) 1987, 1996 Borland International
    Fatal: Unable to open file 'var.obj'
    


  • So funkioniert es bei mir aber ist das so sinnvoll gelöst?

    .model small
    .stack 100h
    .data
    
    count db 3 dup("."),"$"
    
    wert  db 10 dup ("1","2","3") , "$"
    wert2 db 10 dup ("1","1","1") , "$"
    
    .code
    
    start:
    
    		mov ax,@data
    		mov ds,ax
    
    		mov si,offset wert
    		mov di,offset wert2
    
    		mov cx,size count
    
    i:	
    		mov al,[si]				
    		mov dl,[di]
    
    		add dl,al
    		sub dl,30h
    
    		mov ah,2h
    		int 21h
    
    		inc si
    		inc di
    
    loop i
    
    		mov ah,4ch
    		int 21h
    
    end start
    


  • TASM im MASM Modus sollte SIZEOF kennen ... kannst ja mal ausprobieren.
    Was SIZE macht kann ich dir nicht sagen, es liegt aber nahe das es die Größe zurückgibt - Ein Test sollte Klarheit bringen 🙂



  • "size" gibt laut der TASM quick reference im masm-Modus die Anzahl der fuer den Operanden reservierten Elemente * der Groesse deren Typs in Byte zurueck (also praktisch wohl die Zahl der Bytes die fuer eine "Variable" reserviert wurden).

    Sollte also das sein was du suchst. Wenn du allerdings die Laenge von dem Array bei "wert" haben willst, wozu hast du dann jetzt "count"?

    "sizeof" kennt der TASM nicht.



  • Masm kenn SIZE aus Kompatibilitätsgrunden. Würde bei dem string wert z.B. 10 zurückgeben und nicht 31.
    Eventuel ist es bei TASM ähnlich gelagert.



  • Ich hatte mich eben gewundert wieso der 10 mal die Ausgabe macht 🤡

    wert db 10

    wert db 3 ^^ So gehts wie ich es mir vorgestellt habe :>

    btw wo gibt es die TASM Quick Reference sowas hab ich gar nicht.

    .model small 
    .stack 100h 
    .data 
    
    wert  db 3 dup ("1","2","3") , "$" 
    wert2 db 3 dup ("1","1","1") , "$" 
    
    .code 
    
    start: 
    
            mov ax,@data 
            mov ds,ax 
    
            mov si,offset wert 
            mov di,offset wert2 
    
            mov cx,size wert 
    
    i:    
            mov al,[si]                
            mov dl,[di] 
    
            add dl,al 
            sub dl,30h 
    
            mov ah,2h 
            int 21h 
    
            inc si 
            inc di 
    
    loop i 
    
            mov ah,4ch 
            int 21h 
    
    end start
    


  • Ist das hier die komplette Offizielle Reference ?

    http://www.faqs.org/faqs/assembly-language/x86/borland/

    Oder er gesagt wo gibt es die Komplette ?



  • 😕
    Die TASM Quick Reference ist eines der "Buecher" (also so richtig mehrere hundert Seiten Papier), die dem TASM beilagen, wenn man ihn gekauft hat. 😉
    Das waren 2 sehr ausfuehrliche User Manuals, und eben diese Referenz mit allen Befehlen.
    Waren damals durchaus sehr hilfreich, als mit Internet noch nicht so viel war. 🕶



  • Probier mal das hier:

    entweder Konstante anlegen:

    z.B. (das hängt von der Länge des Arrays ab)

    Länge db 30

    oder

    länge db $ - wertx benutzen

    (man sollte auch im Debugger gucken, was vor sich geht, und eventuell die eine oder andere Fehlkalkulation von Hand anpassen.)


Log in to reply