windows - Kan ikke udskrive indtastet tekst i x86-samling

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et forsamlingsprogram her, som skal udskrive en streng, tillade brugeren at indtaste nogle tekst, udskrive den nøjagtige samme tekst igen og derefter vente på en tastetryk for at afslutte programmet ved kun at bruge Win32 native funktioner.

Problemet er, at alt ser ud til at virke, undtagen at udskrive den indtastede brugerstreng. Det udskriver bare en tom ny linje.
Her er koden:


global \_main

extern \_GetStdHandle@4
extern \_WriteFile@20
extern \_ReadFile@20
extern \_ExitProcess@4

section .text

\_main:
    mov ebp, esp
    sub esp, 12

    push -11
    call \_GetStdHandle@4
    mov ebx, eax

    push 0
    push dword [ebp - 12]
    lea ecx, [\_msg\_end - \_msg]
    push ecx
    lea edx, [\_msg]
    push edx
    push ebx
    call \_WriteFile@20

    push -10
    call \_GetStdHandle@4
    mov ebx, eax

    push 0
    lea ecx, [ebp - 8]
    push ecx
    push 20
    lea edx, [ebp - 4]
    push edx
    push ebx
    call \_ReadFile@20

    push -11
    call \_GetStdHandle@4
    mov ebx, eax

    push 0
    push dword [ebp - 12]
    lea ecx, [ebp - 8]
    push ecx
    lea edx, [ebp - 4]
    push edx
    push ebx
    call \_WriteFile@20

    push -10
    call \_GetStdHandle@4
    mov ebx, eax

    push 0
    lea ecx, [ebp - 8]
    push ecx
    push 1
    lea edx, [ebp - 4]
    push edx
    push ebx
    call \_ReadFile@20

    push 0
    call \_ExitProcess@4
\_msg:
    db "Hello, world!", 10
\_msg\_end:


REDIGER - Her er arbejdskoden:


global \_main

extern \_GetStdHandle@4
extern \_ReadFile@20
extern \_WriteFile@20
extern \_ExitProcess@4

section .bss
\_input\_buf: resb 20

section .text
\_main:
    mov ebp, esp
    sub esp, 8

    push -10
    call \_GetStdHandle@4
    mov ebx, eax

    push 0
    lea ecx, [ebp - 4]
    push ecx
    push 20
    lea eax, [\_input\_buf]
    push eax
    push ebx
    call \_ReadFile@20

    push -11
    call \_GetStdHandle@4
    mov ebx, eax

    push 0
    lea ecx, [ebp - 8]
    push ecx
    mov edx, [ebp - 4]
    push edx
    lea eax, [\_input\_buf]
    push eax
    push ebx
    call \_WriteFile@20

    push 0
    call \_ExitProcess@4

Bedste reference


To ting:


Du tildeler kun 4 byte - hvilket giver plads til to tegn - da du læser input til det sidste tildelte dword på stakken:


ebp-12 [undefined]
ebp-8: [input length]
ebp-4: [input buffer]
ebp:


Du 'giver længden af ​​inputstrengen som en pointer i stedet for at fjerne det, hvilket gør det muligt at forsøge at udstille et stort antal bytes og svigtende:


lea ecx, [ebp - 8]
push ecx <- address, not value