ReadConsoleA proto
WriteConsoleA proto
SetConsoleCursorPosition proto
ExitProcess proto
main proto
GetStdHandle proto
io proto
ReadString proto
GetConsoleScreenBufferInfo proto
WriteConsoleOutputCharacterA proto
WriteConsoleOutputAttribute proto
qp proto
STD_INPUT_HANDLE = -10
STD_OUTPUT_HANDLE = -11
.data
kjdflk byte 21 dup (0)
.code
main proc
call io
mov rdx,offset kjdflk
mov rcx,sizeof kjdflk
call ReadString
mov ecx,0
call ExitProcess
main endp
io proc uses rax rbx rcx rdx rsi rdi r8 r9 r10 r11 r12 r13 r14 r15
max = 14;最多输入max减3个字符
.data
COORD struct
X word 0
Y word 0
COORD ENDS
UserData byte 60 dup (?);大小需要与最多输入字符数相适应
consoleINhandle qword ?
consoleOUThandle qword ?
bytesWritten qword ?
big COORD <0,0>
hh byte "firstname:"
byte "lastname:"
byte "age:"
byte "phonenumber:"
cool qword ?
.code
sub rsp,48
mov rbx,offset UserData
mov rsi,rbx
lea rdi,bytesWritten
mov rcx,STD_INPUT_HANDLE
CALL GetStdHandle
mov consoleINhandle,rax
mov rcx,4
L1:
push rcx
mov rcx,consoleINhandle
mov rdx,rbx
mov r8 ,max
lea r9 ,[rdi]
mov qword ptr [rsp + 4 * sizeof qword],0
call ReadConsoleA
mov rcx,max
sub rcx,[rdi]
add rbx,[rdi]
L4:
inc rbx
mov byte ptr [rbx],0;向多余的内存放入0
loop L4
pop rcx
loop L1
call qp
mov r12,offset hh
mov r13,offset cool
mov r14w,1
mov rdx,offset big
mov rcx,STD_OUTPUT_HANDLE
CALL GetStdHandle
mov consoleOUThandle,rax
mov rcx,4
L2:
push rcx
inc r14w
mov r15,0;重置字符数计数器
push r12
call count;获得即将输出的字符数
pop r12 ;保留前缀偏移量
mov rcx,consoleOUThandle
mov rdx,r12
mov r8,r15
lea r9,[r13]
mov qword ptr [rsp + 4 * sizeof qword],0
call WriteConsoleA
call count ;获得前缀的偏移量
call counting ;获得下一个用户信息的开头
mov rcx,consoleOUThandle
mov rdx,rsi
mov r8,rdi
lea r9,[r13]
mov qword ptr [rsp + 4 * sizeof qword],0
call WriteConsoleA
add rsi,max
mov rdx,offset big
mov (COORD ptr [rdx]).Y,r14w
mov (COORD ptr [rdx]).X,0
mov rcx,consoleOUThandle
MOV rdx,rdx
call SetConsoleCursorPosition;设置光标位置
pop rcx
dec rcx
cmp rcx,0
je L3
jmp L2
L3:
add rsp,48
ret
io endp
qp proc ;清空屏幕
.data
SMALL_RECT STRUCT
Left word ?
Top word ?
Right word ?
Bottom word ?
SMALL_RECT ends
CONSOLE_SCREEN_BUFFER_INFO STRUCT
dwsize COORD<>
dwCursorPosition COORD<>
wAttributes word ?
srWindow SMALL_RECT<>
dwMaximumWindowSize COORD <>
CONSOLE_SCREEN_BUFFER_INFO ENDS
COORD struct
X word 0
Y word 0
COORD ENDS
maxi equ 512
long qword 0
kong byte maxi dup (' ')
nb qword ?
heh CONSOLE_SCREEN_BUFFER_INFO <>
gg COORD <0,0>
ff COORD <0,0>
sx word maxi dup (0)
ll qword 0
.code
push rax
push rcx
push rdx
push r8
push r9
push rsi
push rdi
sub rsp,48
mov rcx,STD_OUTPUT_HANDLE
call GetStdHandle
mov consoleOutHandle,rax
mov rcx,consoleOutHandle
mov rdx,offset heh
call GetConsoleScreenBufferInfo;获得缓冲区大小
mov cx,heh.dwsize.X
mov word ptr ll,cx
cmp cx,maxi
jna L1
mov ll,maxi;如果小于最大值则为字符数,大于最大值则输出最大值
L1:
mov rcx,ll
mov rdi,offset sx
L3:
mov ax,heh.wAttributes
mov [rdi],ax
add rdi,2
loop L3 ;填充属性
MOV RDI,OFFSET heh.dwsize
mov rcx,0
mov ax,(COORD ptr [rdi]).X
mov word ptr long,ax
MOV CX,(COORD PTR [RdI]).Y
mov rsi,offset ff
L2:
push cx
mov rax,offset nb
mov rcx,consoleOutHandle
mov rdx,offset kong
mov r8,long
mov r9,[rsi]
mov qword ptr [rsp + 4 * sizeof qword],rax
call WriteConsoleOutputCharacterA ;清空屏幕
mov rax,offset nb
mov rcx,consoleOutHandle
mov rdx,offset sx
mov r8,long
mov r9,[rsi]
mov qword ptr [rsp + 4 * sizeof qword],rax
call WriteConsoleOutputAttribute ;恢复属性
inc ff.Y
mov rcx,0
pop cx
dec cx
jne L2
mov rcx,consoleOutHandle
mov rdx,offset gg
call SetConsoleCursorPosition ;设置光标
add rsp,48
pop rdi
pop rsi
pop r9
pop r8
pop rdx
pop rcx
pop rax
ret
qp endp
count proc uses rax
L2:
inc r12
inc r15
mov al,byte ptr [r12]
cmp al,':'
je L1
jmp L2
L1:
add r12,1
add r15,1
ret
count endp
counting proc uses rsi
mov rdi,0
L2:
cmp byte ptr [rsi],0
je L1
inc rdi
inc rsi
jmp L2
L1:
ret
counting endp
end