StdOut Problem mit MASM



  • Hallo wenn ich hier 3 Buchstaben z.b. eingebe dann wird der String nur 2 mal ausgebebn wenn ich jedoch nur 1 oder 2 Buchstabe eingeben dann werden diese 5 mal ausgeben.

    Wieso geht das nicht wenn ich 3 Buchstaben eingebe ? O_o
    :xmas2:

    .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
    
    var dword "0" , 0 
    buf dword 100 dup (?) 
    
    .code
    
    start:
    
    invoke StdIn , addr buf , 98
    
    mov eax , dword ptr buf
    mov dword ptr var , eax
    
    xor ecx,ecx
    
    i:
    
    	inc ecx
    
    	push ecx
    
    	invoke StdOut ,  addr var
    
    	pop ecx
    
    	cmp ecx ,5 
    	je ende
    
    jmp i
    
    ende:
    
    invoke ExitProcess , 0
    
    end start
    


  • SdtIn liest den Zeilenumbruch mit in den Puffer ein (CR,LF). Wenn du dann nur 4 Byte kopierst, wird nur der Wagenrücklauf (CR=0x0d) mit kopiert -> die Cursorposition ändert sich nach der Ausgabe nicht, woraus folgt das sie immer wieder überschrieben wird.



  • Hallo danke für die Antwort ich hatte jetzt endlich mal Zeit mir das nochmal anzugucken.

    Hier ist mein versuch das Problem zu lösen aber irgendwie klappt das nicht so ganz wie ich will. ^^

    .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 
    
    var dword "0" , 0 
    buf dword 100 dup (?) 
    
    endl DB 13,10 
    
    .code 
    
    start: 
    
    invoke StdIn , addr buf , 98 
    
    mov eax , dword ptr buf 
    mov dword ptr var , eax 
    
    xor ecx,ecx 
    
    i: 
    
        inc ecx 
        push ecx 
    
        invoke StdOut , addr var 
    	invoke StdOut , addr endl 
    
        pop ecx 
        cmp ecx ,5
    
        je ende 
    
    jmp i 
    
    ende: 
    
    invoke ExitProcess , 0 
    
    end start
    
    D:\masm32\bin>console
    1
    1
    
    1
    
    1
    
    1
    
    1
    
    D:\masm32\bin>console
    123
    123
    123
    123
    123
    123
    
    D:\masm32\bin>
    

    Wenn ich z.b. nur eine 1 eingebe dann wird das ja immer so ausgeben:

    D:\masm32\bin>console
    1
    1
    
    1
    
    1
    
    1
    
    1
    

    wie würdet Ihr das lösen ?



  • macros4ever:

    include masm32rt.inc
    .code
    main proc
    	mov esi,input() ; max. 131 Zeichen
    	xor edi,edi
    	.while edi < 5
    		print esi,13,10
    		inc edi
    	.endw
    	inkey
    	ret
    main endp
    end main
    

    ansonsten mal drüber nachdenken, wie man einen string kopiert.

    masm



  • Wenn man sich das ganze von Hand zusammenstrickt, könnte es z.B. so aussehen:

    -u 100 137
    1DD9:0100 31C9           XOR    CX,CX
    1DD9:0102 BB0002         MOV    BX,0200
    1DD9:0105 B401           MOV    AH,01
    1DD9:0107 CD21           INT    21
    1DD9:0109 3C0D           CMP    AL,0D
    1DD9:010B 7406           JZ     0113
    1DD9:010D 8807           MOV    [BX],AL
    1DD9:010F 43             INC    BX
    1DD9:0110 41             INC    CX
    1DD9:0111 EBF4           JMP    0107
    1DD9:0113 C7072400       MOV    Word Ptr [BX],0024
    1DD9:0117 83C302         ADD    BX,+02
    1DD9:011A BE0002         MOV    SI,0200
    1DD9:011D 89DF           MOV    DI,BX
    1DD9:011F F3             REPZ
    1DD9:0120 A4             MOVSB
    1DD9:0121 B402           MOV    AH,02
    1DD9:0123 BA0D0A         MOV    DX,0A0D
    1DD9:0126 CD21           INT    21
    1DD9:0128 C1EA08         SHR    DX,08
    1DD9:012B CD21           INT    21
    1DD9:012D 81C2F601       ADD    DX,01F6
    1DD9:0131 B409           MOV    AH,09
    1DD9:0133 CD21           INT    21
    1DD9:0135 CD20           INT    20
    
    -d 100
    1DD9:0100  31 C9 BB 00 02 B4 01 CD-21 3C 0D 74 06 88 07 43  1I;..4.M!<.t...C
    1DD9:0110  41 EB F4 C7 07 24 00 83-C3 02 BE 00 02 89 DF F3  AktG.$..C.>..._s
    1DD9:0120  A4 B4 02 BA 0D 0A CD 21-C1 EA 08 CD 21 81 C2 F6  $4.:..M!Aj.M!.Bv
    1DD9:0130  01 B4 09 CD 21 CD 20 00-00 00 00 00 00 00 00 00  .4.M!M .........
    1DD9:0140  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    1DD9:0150  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    1DD9:0160  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    1DD9:0170  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
                                                 .
    -d 200 2a0
    1DD9:0200  C8 61 6C 6C 6F 2C 20 54-65 73 74 2C 20 74 65 73  Hallo, Test, tes
    1DD9:0210  74 69 6E 67 2C 20 77 81-72 64 65 6E 20 53 69 65  ting, w.rden Sie
    1DD9:0220  20 6D 61 6C 20 62 69 74-74 65 20 73 63 68 94 6E   mal bitte sch.n
    1DD9:0230  65 20 53 63 68 65 69 E1-65 20 73 61 67 65 6E 3F  e Scheiae sagen?
    1DD9:0240  3F 3F 3B 29 29 5E 5E 24-00 48 61 6C 6C 6F 2C 20  ??;))^^$.Hallo,
    1DD9:0250  54 65 73 74 2C 20 74 65-73 74 69 6E 67 2C 20 77  Test, testing, w
    1DD9:0260  81 72 64 65 6E 20 53 69-65 20 6D 61 6C 20 62 69  .rden Sie mal bi
    1DD9:0270  74 74 65 20 73 63 68 94-6E 65 20 53 63 68 65 69  tte sch.ne Schei
    1DD9:0280  E1 65 20 73 61 67 65 6E-3F 3F 3F 3B 29 29 5E 5E  ae sagen???;))^^
    1DD9:0290  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
    

    Allerdings fehlt hier noch das Setzen eines Buffers. Man kann aber dem Code oben entnehmen, wie man z.B. vorgehen könnte.



  • und was hat dieser olle 16Bit Kram jetzt mit seiner Frage zu tun? - genau, Garnichts! Es ist einfach unglaublich, dass dieser Misst immer noch propagiert wird.

    👎



  • Macros sind doch langweillig das kann ja jeder.^^



  • 😮 schrieb:

    Macros sind doch langweillig das kann ja jeder.^^

    Die ganzen Hochsprachfeatures von MASM sind langweilig 😉


Anmelden zum Antworten