- 浏览: 108729 次
- 性别:
- 来自: Mars
文章分类
最新评论
-
a376730551:
红色部分表示 把进位值传递给bh
汇编语言AAA指令多字节加法代码分析(5) -
madbluesky:
死了,只剩下赞扬了...看来不只是中国,全世界都是同一套啊.. ...
麦克杰克逊--------世界上最傻的明星 -
sunloveny:
敬你!
麦克杰克逊--------世界上最傻的明星 -
jiorry:
感动
MJ 一路走好
麦克杰克逊--------世界上最傻的明星 -
javaboy2006:
MJ单纯到不懂得保护自己。永远怀念。
麦克杰克逊--------世界上最傻的明星
来自于《Intel汇编语言程序设计》(第四版)第11章---------32位windows编程。
所谓控制台,就是我们平常在使用XP系统时,在运行框输入CMD之后出现的那个黑色画面,他看起来与DOS系统很相似,但是两者却完全不同。
32位控制台程序运行在保护模式下,而DOS却运行在实模式下。
另外两者使用的函数库也完全不同,Win32控制台程序使用的就是windows下的那些API,而DOS系统使用的却是BIOS和MS-DOS中断。
每个win32控制台程序有一个输入缓冲区还有一个或多个屏幕缓冲区,输入缓冲区我们可以看做一个输入流,里面包含了一个输入动作记录的队列,每个输入动作(键盘,鼠标)都会在输入缓冲区中产生一个记录。
现在我们来看一下这个程序,它读取用户输入的字符:
TITLE Read From the Console ( ReadConsole.asm )
; This program reads a line of input from standard input.
INCLUDE Irvine32.inc
BufSize = 80
.data
buffer BYTE BuffSize DUP(?),0,0
stdInHandle DWORD ?
bytesRead DWORD ?
.code
main PROC
; Get handle to standard input
INVOKE GetStdHandle , STD_INPUT_HANDLE
mov stdInHandle , eax
; Wait for user input
INVOKE ReadConsole , stdInHandle , ADDR buffer,
BufSize - 2 , ADDR bytesRead , 0
; Display the buffer
mov esi , OFFSET buffer
mov ecx,16 ; 16 bytes
mov ebx , TYPE buffer
call DumpMem
exit
main ENDP
END main
我们先回顾一下win32控制台程序相关的内容。
如果我们要对控制台进行操作,我们需要使用控制台函数,而几乎每个控制台函数都需要一个32位无符号整数类型的句柄来唯一确定一个对象,句柄的类型如下:
STD_INPUT_HANDLE ; 标准输入句柄
STD_OUTPUT_HANDLE ; 标准输出句柄
STD_ERROR_HANDLE ; 标准错误输出句柄
要想得到一个句柄,我们可以使用GetStdHandle函数,函数原型为:
GetStdHandle PROTO
nStdHandle : DWORD ; 句柄的类型
例如,我们可以使用如下方法得到句柄,并将句柄值保存起来:
.data
inputHandle DWORD ?
.code
INVOKE GetStdHandle , STD_INPUT_HANDLE
mov inputHandle , eax
而在本程序中,我们用到了一个ReadConsole函数,它用于将一个文本输入读取到缓冲区中,函数原型如下:
ReadConsole PROTO ,
handle : DWORD ; 输入句柄
pBuffer : PTR BYTE, ; 缓冲区地址指针
maxBytes : DWORD, ; 要读取的字符串数量
pBytesRead : PTR DWORD, ; 指向返回实际读取量大小的指针
notUsed: DWORD ; (保留)
程序其实非常简单:
; Get handle to standard input
INVOKE GetStdHandle , STD_INPUT_HANDLE ; 首先调用GetStdHandle 获得一个句柄
mov stdInHandle , eax ; 将句柄保存到变量stdInHandle 中
; Wait for user input
INVOKE ReadConsole , stdInHandle , ADDR buffer, ;这里为ReadConsole传递参数,其中BufSize - 2是因为我们要接受一个回车,它占用了 0Dh 和 0Ah 两个字节
BufSize - 2 , ADDR bytesRead , 0
; Display the buffer
mov esi , OFFSET buffer
mov ecx,16 ; 我们决定Dump出16个字节长度
mov ebx , TYPE buffer
call DumpMem ; Dump
当我们在控制台输入abcdefg之后的结果是:
61 62 63 64 65 66 67 0D 0A 00 00 00 00 00 00 00
可以看到缓冲区中的数据一共为9个,包括abcdefg和最后的用户按下回车键所产生的换行符和回车符。这时ReadConsole 函数的返回值pBytesRead中保存的也是9 。
下面我们来看单个字符的输入。
在控制台下输入单个字符与之前的程序有点不同,原书告诉我们控制台输入单字符要用以下步骤:
1.使用GetConsoleMode函数获取控制台的当前模式,将其暂时保存到一个变量中
2.使用GetConsoleMode来改变控制台的输入模式。
3.用ReadConsole函数读取一个字符
4.用SetConsoleMode函数将原先的模式恢复回去
其中GetConsoleMode和SetConsoleMode函数的原型如下:
GetConsoleMode PROTO,
hConsoleHandle : DWORD ; 输入或者输出句柄
lpMode : PTR DWORD ; 一个双字变量指针
SetConsoleMode PROTO,
hConsoleHandle : DWORD ; 控制台句柄
dwMode : DWORD ; 控制台模式标志位
然后是读取单个从键盘输入的字符的程序如下:
.data
saveFlags DWORD ? ; back up of flags
.code
; Get & save the current console input mode flags
INVOKE GetConsoleMode,
consoleInHandle,
ADDR saveFlags
; Clear all console flags
INVOKE SetConsoleMode,
consoleInHandle,
0 ; new flag values
; Read a single character from input
INVOKE ReadConsole,
consoleInHandle, ; console input handle
ADDR buffer, ; pointer to buffer
1, ; max characters to read
ADDR bytesRead,0 ; return value
; Restore the previous flags state
INVOKE SetConsoleMode,
consoleInHandle,
saveFlags
结束。
发表评论
-
IA-32处理器内存管理学习总结?
2009-10-23 14:58 1328内容来自于《Intel汇 ... -
汇编语言秒表程序代码分析(21)
2009-10-23 10:40 2256本文代码来自于《Intel汇编语言程序设计》 (第四版) ... -
汇编语言GetDateTime代码分析(20)
2009-10-23 10:14 1798本文代码来自于 ... -
汇编语言计时器代码分析(19)
2009-10-23 09:45 2178来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言写文件读文件代码分析(18)
2009-10-22 16:37 2575内容来自于《Intel汇编语言程序设计》(第 ... -
汇编语言循环遍历链表代码分析(16)
2009-10-22 11:28 1791来自于《Intel汇编语言程序设计》(第四版)第10章- ... -
汇编语言醉汉走路代码分析(15)
2009-10-22 10:50 1308来自于《Intel汇编语言 ... -
汇编语言显示系统时间代码分析(14)
2009-10-21 15:18 2129代码来自于《Intel汇编语言程序设计》(第四版)第10 ... -
汇编语言二分查找排序代码分析(13)
2009-10-21 09:52 1889来自于《Intel汇编语 ... -
汇编语言冒泡排序算法代码分析(12)
2009-10-20 16:52 4175来自于《Intel汇编 ... -
汇编语言裁剪字符串代码分析(11)?
2009-10-20 15:27 1319来自于《Intel汇编语言程序设计》(第四版 ... -
汇编语言求字符串长度代码分析(10)
2009-10-20 11:05 2178来自于《Intel汇编语言程序设计》(第四版)第八 ... -
汇编语言数组乘法代码分析(9)
2009-10-20 10:07 1563来自于《Intel汇编语言程序设计》(第四版)第八章,主 ... -
汇编语言实现递归阶乘算法代码分析(8)
2009-10-20 08:49 3698来自于《Intel汇编语言程序设计》(第四版)第八 ... -
《Intel汇编语言程序设计》第四版勘误
2009-10-19 16:14 996215页: mov BYTE PTR [e ... -
汇编语言16位随机整数填充数组代码分析(7)
2009-10-19 14:55 1402来自于《Intel汇编语言》(第四版)第八章的一段 ... -
汇编语言值传递和引用传递代码分析(6)
2009-10-19 09:40 1186来自于《Intel汇编语言程序设计》(第四版)的第 ... -
汇编语言AAA指令多字节加法代码分析(5)
2009-10-18 10:44 4340来自于《Intel汇编语言程序设计》(第五版)第七章的代 ... -
汇编语言表格驱动分支选择代码分析(4)
2009-10-16 14:48 1451来自于《Intel汇编语言程序设计》(第四版)第六章。 ... -
汇编语言数组中查找正数代码分析(3)
2009-10-15 16:54 1304《Intel汇编语言程序 ...
相关推荐
当敲下回车后,子程读取字符结束,将进行三次判断三角形两边之和是否大于第三边。然后根据是否能构成三角形输出“Y”或者“N”。子程的最后恢复现场,通用寄存器的值依次出栈。程序结束。 程序运行结果如下图1所示,...
18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
提取并分析核心启动参数(从环境变量中读取参数,设置相应标志位等待处理,(parse_options()) 控制台初始化(为输出信息而先于PCI初始化,console_init()) 剖析器数据结构初始化(prof_buffer和prof_len变量) ...
ASM:汇编语言源文件,Pro/E装配文件 ASP:动态网页文件;ProComm Plus安装与连接脚本文件;Astound介绍文件 AST:Astound多媒体文件;ClarisWorks“助手”文件 Axx:ARJ压缩文件的分包序号文件,用于将一个大...
支持静态链接其它编程语言(如C/C++、汇编等)编译生成的静态库(.LIB或.OBJ),但仅限于COFF格式,支持cdecl和stdcall两种函数调用约定。 使用说明如下:函数声明和调用方法与DLL命令一致;“库文件名”以.lib...
9.4 xml流样式分析程序 348 9.4.1 写入xml流 349 9.4.2 读取xml流 352 9.4.3 文档对象模型(dom) 360 9.5 xslt转换 364 9.5.1 使用xslt转换不同的xml标准 367 9.5.2 system.xml.xsl中定义的其他类和接口 ...
#define __LIBRARY__ // 定义该变量是为了包括定义在unistd.h 中的内嵌汇编代码等信息。 #include <unistd.h> // *.h 头文件所在的默认目录是include/,则在代码中就不用明确指明位置。 // 如果不是UNIX 的标准...
24位转单色位图模块.ec 32张发牌.ec 3D引擎支持库-eOgre.ec 69msn.ec ACCESS 到高级表格.ec Access操作.ec Access数据库压缩修复新建.ec ACCSEE记录显示到超级列表框模块.ec ACSII 加解密模块2.0.ec AD.ec ADO方式...
24位转单色位图模块.ec 32张发牌.ec 3D引擎支持库-eOgre.ec 69msn.ec ACCESS 到高级表格.ec Access操作.ec Access数据库压缩修复新建.ec ACCSEE记录显示到超级列表框模块.ec ACSII 加解密模块2.0.ec AD.ec ADO方式...