assembly – 缓冲输入的工作原理
下一个程序的输入工作正常,但是当我要求显示输出时,DOS
?根本不显示任何东西!这怎么可能? ORG 256 mov dx,msg1 mov ah,09h ;DOS.WriteString int 21h mov dx,buf mov ah,0Ah ;DOS.BufferedInput int 21h mov dx,msg2 mov ah,09h ;DOS.WriteString int 21h mov ax,4C00h ;DOS.TerminateWithExitcode int 21h ; -------------------------------------- msg1: db 'Input : ','$' buf: db 20 dup ('$') msg2: db 13,10,'Output : ','$' ; -------------------------------------- 解决方法
看看你如何定义你的输入缓冲区(buf:db 20 dup(‘$’)),我明白了
?你想要偷工减料并且输入已经为$-terminated准备好了 ?重新显示它.遗憾的是,这会扰乱DOS输入所需的设置 ?功能0Ah和您的程序遇到潜在缓冲区的严重问题 ?超限. 此外,使用$-termination并不是您可以做出的最明智的选择 ?因为$字符可能已经出现在输入的字符中. ?我在下面介绍的所有示例程序都将使用零终止 ?代替. 使用int输入文本21h AH = 0Ah 这个Buffered STDIN Input函数从键盘获取字符 令人惊讶的是,此功能的编辑功能有限. > Escape从当前输入中删除所有字符. 还有更多编辑键可用.它们都让人想起EDLIN.EXE, > F1将模板中的一个字符复制到新行. 选项卡由此功能扩展.标签扩展是替换的过程 这个函数执行ctrlC / ctrlBreak 当此函数完成时,光标将位于最左侧的列中 例1,缓冲STDIN输入. ORG 256 ;Create .COM program cld mov si,msg1 call WriteStringDOS mov dx,0Ah ;DOS.BufferedInput int 21h mov si,msg2 call WriteStringDOS mov si,buf+2 movzx bx,[si-1] ;Get character count mov word [si+bx+1],10 ;Keep CR,append LF and 0 call WriteStringDOS mov ax,4C00h ;DOS.TerminateWithExitcode int 21h ; -------------------------------------- ; IN (ds:si) OUT () WriteStringDOS: pusha jmps .b .a: mov dl,al mov ah,02h ;DOS.DisplayCharacter int 21h ; -> AL .b: lodsb test al,al jnz .a popa ret ; -------------------------------------- buf: db 255,16,"I'm the template",13,255-16-1+2 dup (0) msg1: db 'Choose color ? ',0 msg2: db 10,'You chose ',0 ; -------------------------------------- 使用int 21h AH = 3Fh输入文本 当与预定义的句柄0(在BX中)一起使用时,这个Read From File Or Device 可以使用上一节中描述的所有编辑键. 选项卡仅在屏幕上展开,而不在模板中展开. 这个函数执行ctrlC / ctrlBreak 当此函数完成时,光标将位于最左侧的列中 >如果终止换行符不在返回的字节中,则为当前行. 例2a,从文件或设备读取,一次全部拿起. ORG 256 ;Create .COM program cld mov si,buf mov cx,127+2 ;Max input is 127 chars + CR + LF xor bx,bx ;STDIN=0 mov ah,3Fh ;DOS.ReadFileOrDevice int 21h ; -> AX CF jc Exit mov bx,ax ;Bytes count is less than CX mov si,buf mov [si+bx],bh ;Keep CR and LF,append 0 (BH=0) call WriteStringDOS Exit: mov ax,al jnz .a popa ret ; -------------------------------------- buf: db 127+2+1 dup (0) msg1: db 'Choose color ? ',0 msg2: db 'You chose ',0 ; -------------------------------------- 例2b,一次拾取一个字节. ORG 256 ;Create .COM program cld mov si,1 xor bx,3Fh ;DOS.ReadFileOrDevice int 21h ; -> AX CF jc Exit mov si,dx ;DX=buf,CX=1,BX=0 Next: mov ah,3Fh ;DOS.ReadFileOrDevice int 21h ; -> AX CF jc Exit call WriteStringDOS ;Display a single byte cmp byte [si],10 jne Next Exit: mov ax,al jnz .a popa ret ; -------------------------------------- msg1: db 'Choose color ? ','You chose ' buf: db 0,0 ; -------------------------------------- 使用int 2Fh AX = 4810h输入文本 这个DOSKEY Buffered STDIN Input函数只能调用if the > Up从历史记录中获取上一个项目. 在DOS 6.2上,存储空间始终限制为128个字节,允许输入 这个函数执行ctrlC / ctrlBreak 当此函数完成时,光标将位于最左侧的列中 由于输入的文本被添加到命令历史中,因此不可避免 例3,调用DOSKEY.COM. ORG 256 ;Create .COM program cld mov ax,4800h ;DOSKEY.CheckInstalled int 2Fh ; -> AL test al,al mov si,err1 jz Exit_ Again: mov si,buf mov ax,4810h ;DOSKEY.BufferedInput int 2Fh ; -> AX test ax,ax mov si,err2 jnz Exit_ cmp [buf+1],al ;AL=0 je Again ;Macro expansion needed mov si,[si-1] ;Get character count (is GT 0) mov word [si+bx+1],append LF and 0 Exit_: call WriteStringDOS Exit: mov ax,al jnz .a popa ret ; -------------------------------------- buf: db 128,128+2 dup (0) msg1: db 'Choose color ? ',0 msg2: db 13,0 err1: db 'N/A',0 err2: db 'Failed',0 ; -------------------------------------- 使用int 21h AH = 08h输入文本
问题理解源?我使用的汇编程序: >将以点(.)开头的标签视为第一级本地标签>将以冒号(:)开头的标签视为第二级本地标签>是单指令多操作数(SIMO),所以推cx si转换为推送cx push si. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Windows Azure Powershell将文件复制到VM
- windows-server-2008-r2 – 是否可以创建新的Windows Serve
- windows – Iscsi成立 – 任何理由我不应该做我正在做的事情
- 什么被认为是Windows服务器的“SSH”?
- active-directory – 我是否仍然拥有物理DC,即使是在Server
- 使用Box Windows SDK v2库在C#桌面应用程序中对Box进行身份
- Windows – Internet Explorer – SID S-1-5-5-0-348885
- 使用Window的RelativeSource进行WPF绑定需要Path中的“Data
- OmniOS / ZFS / Windows 7:对于CIFS / SMB上的所有文件大小
- windows – SCCM客户端中的每个操作实际上做了什么?