Zugriff auf einzelne string Elemente



  • Hallo wie kann man auf einzelne string Elemente zugreifen ohne movs oder movsb.
    Gibt es da irgendeine möglichkeit ?

    .486                                     
    .model flat, stdcall                     
    option casemap :none 
    
    include     \masm32\include\windows.inc
    
    include     \masm32\include\kernel32.inc
    includelib  \masm32\lib\kernel32.lib
    
    include     \masm32\include\masm32.inc
    includelib  \masm32\lib\masm32.lib
    
    include \masm32\include\user32.inc 
    includelib \masm32\lib\user32.lib 
    
    .data
    
    str_1    db "abcdefg",0
    str_2    db ?  
    
    .code
    start:
    
                    mov esi, offset str_1
                    mov edi, offset str_2
    
    				movs byte ptr [edi] , byte ptr[esi]   ; a
    				movs byte ptr [edi] , byte ptr[esi]   ; b
    
    				invoke StdOut ,  addr str_2
    				invoke Sleep , 2000	
    
    invoke ExitProcess , 0
    
    end start
    


  • z.B.
    mov al,[si]

    lodsb oder lodsw
    oder
    xlat

    oder
    mov al,[bx+di]
    mov al,[FFFF]
    usw...



  • nachtfeuer schrieb:

    z.B.
    mov al,[si]
    ...

    Bitte keine 16 Bit-Beispiele!
    🙄



  • du versuchst einen String zu kopieren?:

    include masm32rt.inc
    
    .data
    	szSrc db "irgend ein string",13,10,0
    .code
    main proc
    LOCAL szBuffer[128]:BYTE	
    
    	invoke AllocConsole
    
    	; kopiere szSrc in den Puffer szBuffer[]
    	xor ecx,ecx
    	lea esi,szSrc
    	lea edi,szBuffer
    @@:	movzx eax,BYTE ptr [esi+ecx]
    	mov BYTE ptr [edi+ecx],al
    	test eax,eax
    	lea ecx,[ecx+1]
    	jnz @B
    @@:	
    
    	;Alternativ: szCopy@masmlib
    	;invoke szCopy,ADDR szSrc,ADDR szBuffer
    
    	invoke StdOut,ADDR szBuffer
    	inkey
    	exit
    
    main endp
    end main
    

    masm



  • pointer*** schrieb:

    Hallo wie kann man auf einzelne string Elemente zugreifen ohne movs oder movsb.

    Hallo,

    dein "string" liegt an irgendeiner Speicherstelle, wie jedes andere Byte as auch tut. Soll heißen, hast du ein Label, respektive die Adresse, kannst du auch ein einzelnes Byte oder einen Substring addressieren:

    .DATA
    	str0	db 'abcd', 13, 10, 0
    
    .CODE
    main LABEL DWORD
    	INVOKE StdOut, OFFSET str0		; print "abcd\n"
    	INVOKE StdOut, OFFSET 1[str0]	; print "bcd\n"
    
    	movzx eax, 2[str0]				; eax = 0x63000000
    	movzx eax, 3[str0]				; eax = 0x64000000
    	mov   al, [str0]				; al  = 0x61
    


  • FrEEzE2046 schrieb:

    ; eax = 0x63000000
    ; eax = 0x64000000
    

    das glaub ich nicht 😉



  • aber hallo schrieb:

    nachtfeuer schrieb:

    z.B.
    mov al,[si]
    ...

    Bitte keine 16 Bit-Beispiele!
    🙄

    ach, und wieso nicht? 🙄



  • nachtfeuer schrieb:

    aber hallo schrieb:

    nachtfeuer schrieb:

    z.B.
    mov al,[si]
    ...

    Bitte keine 16 Bit-Beispiele!
    🙄

    ach, und wieso nicht? 🙄

    Der OP programmiert 32 Bit-Code. 16 Bit-Code funktioniert da nicht.



  • aber hallo schrieb:

    nachtfeuer schrieb:

    aber hallo schrieb:

    nachtfeuer schrieb:

    z.B.
    mov al,[si]
    ...

    Bitte keine 16 Bit-Beispiele!
    🙄

    ach, und wieso nicht? 🙄

    Der OP programmiert 32 Bit-Code. 16 Bit-Code funktioniert da nicht.

    Falsch geraten. Naja, das kann vorkommen 😉 - aber die Asm Befehle oben sind auch relativ unabhängig von der jeweiligen SystemBitbreite. Darum ist es fast egal, ob man Assembler mit 16bit oder 32bit oder 64bit lernt. Die Unterschiede liegen vor allem im (Speicher-)Addressierungsmodus. Und der Threadopener sollte eigentlich in der Lage sein, den Beispielcode an seinen eigenen anzupassen.

    Ein gutes Verständnis vom Real Mode gehört übrigens zu den wichtigen Grundlagen der Assemblerprogrammierung.



  • masm schrieb:

    das glaub ich nicht 😉

    Little-Endian versteht sich 😉


Anmelden zum Antworten