windows - WriteConsoleA 输出包含太多字符
问题描述
我需要修复我的输出,其中第一行没有名称,第二行末尾有一个星号。
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
****************************
解决方案
看起来很明显;您将太长的长度传递给第一个 WriteConsoleA。mov r8, lengthof asterisk
后跟add r8, 10
,因此您打印了 10 个额外的字节,这足以包含简短的用户输入。(以及"* "
来自 oneAsterisk 的)
如果您只想打印那个数组,请使用它的长度而不是太长的数组。(不过,您可能想要附加一个换行符,以便您的下一个输出可以从一个新行开始。您的使用输入通常包括一个换行符。)
推荐阅读
- c# - Problem with huge numbers in an incremental game (C#, Unity)
- nestjs - process.env.NODE_ENV always 'development' when building nestjs app with nrwl nx
- jquery - Why isn't jQuery Number Counter updating on html attribute change?
- python - 为什么 python 抛出 ModuleNotFoundError: No module named `blah`
- c - 对已链接的函数的未定义引用
- python - 在Python中使用多线程/多处理对矩阵元素求和
- oracle - 将免费计划 azure web 应用程序连接到 oracle 自治数据库处理
- python - What does a ¨no attribute error¨ mean in python?
- javascript - My attempt to create a simple Gantt chart (Table) using Vue.js
- swift - Swift Package Manager dynamic library