汇编语言Windows编程输入名字、姓氏、年龄和电话号码,加入标签和格式,加入了清空输入的过程(qp),恢复了没有发全的部分,提升了性能

这篇博客介绍了如何使用汇编语言在Windows环境下编程,实现用户输入名字、姓氏、年龄和电话号码的功能。同时,文章详细讲解了处理清空输入的步骤,以及如何恢复未完全展示的内容,以提升程序的用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值