Win32汇编控制台下的几种输入输出方式
2011-02-24 15:33
519 查看
以下文章转自别人的帖子:
在熟悉指令、伪指令和汇编语法的过程中, 首先需要的是输入、输出的手段.
下面是之前尝试出的控制台输入、输出的几种办法:
1、使用 MASM 提供的 StdIn、StdOut 函数;
2、使用系统 API:
3、使用微软 C 标准库 msvcrt.dll 中的 printf 函数.
--------------------------------------------------------------------------------
1、使用 MASM 的 Stdin 和 StdOut 函数:
--------------------------------------------------------------------------------
; Test3_1.asm
; 测试代码前应先建立一个控制台工程: 文件 -> 新建工程 -> Console App ...
.386
.model flat, stdcall
include masm32.inc
include kernel32.inc
includelib masm32.lib
includelib kernel32.lib
.data
len equ 6
.data?
szText dw ?
.code
start:
invoke StdIn, addr szText,len
invoke StdOut, addr szText
ret ;ret 是用于子程序返回的指令, 这里用它代替 ExitProcess(在没有生成 Win32 窗口时是可以的)
end start
--------------------------------------------------------------------------------
2、使用系统 API 函数:
--------------------------------------------------------------------------------
; Test3_2.asm
.386
.model flat, stdcall
include windows.inc
include kernel32.inc
includelib kernel32.lib
.data?
hInput dd ?
lpszBuffer db 50 dup(?)
hOut dd ?
bRead dd ?
.code
start:
invoke GetStdHandle,STD_INPUT_HANDLE ; 获取控制台输入设备的句柄
mov hInput, eax
invoke SetConsoleMode,hInput,ENABLE_LINE_INPUT or /
ENABLE_ECHO_INPUT or /
ENABLE_PROCESSED_INPUT
invoke ReadFile,hInput,addr lpszBuffer,sizeof lpszBuffer,ADDR bRead,NULL
;mov eax, bRead
invoke GetStdHandle, STD_OUTPUT_HANDLE ; 获取控制台输出设备的句柄
mov hOut, eax ; 把获取到的句柄给变量 hOut
invoke WriteFile, hOut, addr lpszBuffer, sizeof lpszBuffer, NULL, NULL
; 输出到控制台, 参数分别是: 句柄、字符串地址、字符串长度、成功写入的字数、异步读写的结构
ret
end start
; 另外前面用到的StdIn、 StdOut 也基本就是这样实现的, 源码在: masm32/m32lib/stdin.asm 、masm32/m32lib/stdout.asm
--------------------------------------------------------------------------------
3、使用微软 C 标准库中的scanf、printf 函数; msvscrt.inc 把它声明做 crt_printf
--------------------------------------------------------------------------------
; Test3_3.asm
.386
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szText db ?
szFmt db '%s', 0
.code
start:
invoke crt_scanf,addr szFmt,addr szText
invoke crt_printf, addr szText
ret
end start
--------------------------------------------------------------------------------
三种方法相比之下, 应推荐使用 C 函数 crt_printf; 因为它可以方便输出更多数据类型, 如:
--------------------------------------------------------------------------------
; Test3_4.asm
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szFmtOut db 'EAX=%d; ECX=%c; ',0ah,0dh,'szText=%s',0
szFmtIn db '%s',0
szText db 'hello word!',0
.code
start:
mov eax, 11
mov ecx, 65
invoke crt_scanf, addr szFmtIn,addr szText
invoke crt_printf, addr szFmtOut, eax, ecx, addr szText
ret
end start
在熟悉指令、伪指令和汇编语法的过程中, 首先需要的是输入、输出的手段.
下面是之前尝试出的控制台输入、输出的几种办法:
1、使用 MASM 提供的 StdIn、StdOut 函数;
2、使用系统 API:
3、使用微软 C 标准库 msvcrt.dll 中的 printf 函数.
--------------------------------------------------------------------------------
1、使用 MASM 的 Stdin 和 StdOut 函数:
--------------------------------------------------------------------------------
; Test3_1.asm
; 测试代码前应先建立一个控制台工程: 文件 -> 新建工程 -> Console App ...
.386
.model flat, stdcall
include masm32.inc
include kernel32.inc
includelib masm32.lib
includelib kernel32.lib
.data
len equ 6
.data?
szText dw ?
.code
start:
invoke StdIn, addr szText,len
invoke StdOut, addr szText
ret ;ret 是用于子程序返回的指令, 这里用它代替 ExitProcess(在没有生成 Win32 窗口时是可以的)
end start
--------------------------------------------------------------------------------
2、使用系统 API 函数:
--------------------------------------------------------------------------------
; Test3_2.asm
.386
.model flat, stdcall
include windows.inc
include kernel32.inc
includelib kernel32.lib
.data?
hInput dd ?
lpszBuffer db 50 dup(?)
hOut dd ?
bRead dd ?
.code
start:
invoke GetStdHandle,STD_INPUT_HANDLE ; 获取控制台输入设备的句柄
mov hInput, eax
invoke SetConsoleMode,hInput,ENABLE_LINE_INPUT or /
ENABLE_ECHO_INPUT or /
ENABLE_PROCESSED_INPUT
invoke ReadFile,hInput,addr lpszBuffer,sizeof lpszBuffer,ADDR bRead,NULL
;mov eax, bRead
invoke GetStdHandle, STD_OUTPUT_HANDLE ; 获取控制台输出设备的句柄
mov hOut, eax ; 把获取到的句柄给变量 hOut
invoke WriteFile, hOut, addr lpszBuffer, sizeof lpszBuffer, NULL, NULL
; 输出到控制台, 参数分别是: 句柄、字符串地址、字符串长度、成功写入的字数、异步读写的结构
ret
end start
; 另外前面用到的StdIn、 StdOut 也基本就是这样实现的, 源码在: masm32/m32lib/stdin.asm 、masm32/m32lib/stdout.asm
--------------------------------------------------------------------------------
3、使用微软 C 标准库中的scanf、printf 函数; msvscrt.inc 把它声明做 crt_printf
--------------------------------------------------------------------------------
; Test3_3.asm
.386
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szText db ?
szFmt db '%s', 0
.code
start:
invoke crt_scanf,addr szFmt,addr szText
invoke crt_printf, addr szText
ret
end start
--------------------------------------------------------------------------------
三种方法相比之下, 应推荐使用 C 函数 crt_printf; 因为它可以方便输出更多数据类型, 如:
--------------------------------------------------------------------------------
; Test3_4.asm
.model flat, stdcall
include msvcrt.inc
includelib msvcrt.lib
.data
szFmtOut db 'EAX=%d; ECX=%c; ',0ah,0dh,'szText=%s',0
szFmtIn db '%s',0
szText db 'hello word!',0
.code
start:
mov eax, 11
mov ecx, 65
invoke crt_scanf, addr szFmtIn,addr szText
invoke crt_printf, addr szFmtOut, eax, ecx, addr szText
ret
end start
相关文章推荐
- 学 Win32 汇编[3]: 控制台下的几种输入、输出方式
- 学 Win32 汇编[3]: 控制台下的几种输出方式
- Java基础——从键盘(控制台)输入字符串(数据)的几种方式详解
- Java控制台输入几种方式的I/O性能
- C语言字符串输入及输出的几种方式
- Java的三种简单的控制台输入和输出方式
- Java控制台输入几种方式的I/O性能
- 递归练习---控制台输入一整数,纵向输出 (方式二)
- 递归练习---控制台输入一整数,纵向输出(方式一)
- [C/C++] 几种常见的字符串输入输出方式
- SAS中数据输入和输出的几种方式
- 几种输入输出方式的区别
- java 输入的几种方式
- 第九周【项目1】在第8周项1的基础上(1)再定义一目运算符 -,-c相当于0-c(2)定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然
- 总结解决springmvc提交数据中文乱码的几种方式、控制台乱码
- java控制台的输入输出
- WIN32控制台程序不能输入中文汉字解决办法
- Log4j不同级别输出到不同文件的几种方式
- 键盘输入,控制台输出,在遇到over时候结束
- Springmvc 配置json输出的几种方式