Вывод WriteConsoleA содержит слишком много символов - PullRequest
0 голосов
/ 08 февраля 2020

Мне нужно исправить вывод, в котором нет имени в первой строке и звездочки в конце второй.

CONSOLE     equ     -11
KEYBOARD    equ     -10

extern  GetStdHandle:   PROTO
extern  WriteConsoleA:  PROTO
extern  ReadConsoleA:   PROTO
extern  ExitProcess:    PROTO

.data
prompt      byte    'What is your name? '
asterisk    byte    ' ****************************'
oneAsterisk byte    '* '
myname      byte    40 dup(0)

.data?
stdin       qword ? 
stdout      qword ?
numWrite    qword ?
numRead     qword ?

.code
mainCRTStartup  PROC    ;Initialize the program

                sub rsp, 20     ;reserve shadow space

                ;Get handle id to console window & keyboard
                mov rcx, CONSOLE    ;/subsystem:console
                call GetStdHandle   ;handle in rax
                mov stdout, rax     ;save out handle
                mov rcx, KEYBOARD   ; keyboard code
                call GetStdHandle   ;handle in rax
                mov stdin, rax      ;save in handle

                ;Display message on console window
                mov rcx, stdout     ;parm1 = console handle
                lea rdx, prompt     ;parm2 = ascii message
                mov r8, lengthof prompt ;# bytes to display
                lea r9, numWrite    ;display message
                call WriteConsoleA  ;display message

                ;Read ASCII from the keyboard
                mov rcx, stdin      ;parm1 = keyboard handle
                lea rdx, myname     ;parm2 = ascii buffer
                mov r8, lengthof myname ;# bytes to read
                lea r9, numRead     ;& to store #bytes actually read
                call ReadConsoleA   ;get keystrokes

                ;Display first message on console window
                mov rcx, stdout             ;parm1 = console handle
                lea rdx, asterisk           ;parm2 = ascii message 
                ;# bytes to dispaly
                mov r8, lengthof asterisk   ;length
                add r8, 10
                sub r9, 2
                mov qword ptr [rsp + 32], 0 ;parm5 = 0 (unused)
                call WriteConsoleA          ;display message

                ;Display second message on console window
                mov rcx, stdout             ;parm1 = console handle
                lea rdx, oneAsterisk        ;parm2 = ascii message 
                ;# bytes to dispaly
                mov r8, lengthof oneAsterisk;length
                add r8, numRead             ;add length name 
                lea r9, numWrite            ;& to store #bytes written
                mov qword ptr [rsp + 32], 0         ;parm5 = 0 (unused)
                call WriteConsoleA      ;display message

                ;Display third message on console window
                mov rcx, stdout         ;parm1 = console handle
                lea rdx, asterisk       ;parm2 = ascii message 
                ;# bytes to dispaly
                mov r8, lengthof asterisk;length
                sub r9, 2
                mov qword ptr [rsp + 32], 0;parm5 = 0 (unused)
                call WriteConsoleA      ;display message



                ;Finalize program and exit
                add rsp, 20         ;restore shadow space
                mov rcx, 0          ;return code %errorlevel%
                call ExitProcess    ;exit
mainCRTStartup  ENDP
END

Вывод:

What is your name? Jeff
 ***************************** Jeff
 * Jeff
 ****************************

1 Ответ

1 голос
/ 08 февраля 2020

Кажется довольно очевидным; Вы передаете слишком длинную длину первому WriteConsoleA. За mov r8, lengthof asterisk следует add r8, 10, поэтому вы печатаете 10 дополнительных байтов, что достаточно для включения короткого пользовательского ввода. (И "* " от oneAsterisk)

Если вы просто хотите напечатать этот один массив, используйте его длину, а не слишком длинную. (Однако, возможно, вы захотите добавить новую строку, чтобы ваш следующий вывод мог начинаться с новой строки. Ваш ввод при использовании обычно будет включать новую строку.)

...