Невозможно напечатать обратно введенный текст в сборке x86 - PullRequest
0 голосов
/ 03 марта 2012

У меня есть программа на ассемблере, которая должна напечатать строку, позволить пользователю ввести некоторый текст, снова напечатать тот же самый текст, а затем ждать нажатия клавиши, чтобы завершить программу, используя только собственные функции Win32.
Проблема в том, что все работает, кроме печати введенной пользователем строки. Он просто печатает пустую новую строку. Вот код:

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:

РЕДАКТИРОВАТЬ - Вот рабочий код:

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

1 Ответ

1 голос
/ 03 марта 2012

Две вещи:

Вы выделяете только 4 байта - освобождая место для двух символов - когда вы читаете ввод последнего выделенного двойника в стеке:

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

ВыВы даете длину входной строки в качестве указателя, а не разыменовываете ее, пытаетесь вывести огромное количество байтов и терпите неудачу:

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