2010-04-27 303 views

回答

2

只需通过使用Win32 API:通过写STD_OUTPUT_HANDLE(从STD_INPUT_HANDLE阅读)。 See GetStdHandle() in MSDN作为出发点... 使用MASM HLL构造来帮助您(INVOKE是您的朋友,用于调用Win32函数并传递参数)。

7

正如filofel所说,使用Win32 API。这里有一个小的hello world例子:

.386 
.MODEL flat, stdcall 
STD_OUTPUT_HANDLE EQU -11 
GetStdHandle PROTO, nStdHandle: DWORD 
WriteConsoleA PROTO, handle: DWORD, lpBuffer:PTR BYTE, nNumberOfBytesToWrite:DWORD, lpNumberOfBytesWritten:PTR DWORD, lpReserved:DWORD 
ExitProcess PROTO, dwExitCode: DWORD 

.data 
consoleOutHandle dd ? 
bytesWritten dd ? 
message db "Hello World",13,10 
lmessage dd 13 

.code 
main PROC 
    INVOKE GetStdHandle, STD_OUTPUT_HANDLE 
    mov consoleOutHandle, eax 
    mov edx,offset message 
    pushad  
    mov eax, lmessage 
    INVOKE WriteConsoleA, consoleOutHandle, edx, eax, offset bytesWritten, 0 
    popad 
    INVOKE ExitProcess,0 
main ENDP 
END main 

要装配:

ml.exe helloworld.asm /link /subsystem:console /defaultlib:kernel32.lib /entry:main 

我们捕获输入,你会同样进行,使用API​​函数,如ReadConsoleInput。我把这个作为练习留给你。

2

“控制台”在现代Windows世界中可能相当模糊。如果通过控制台程序,你确实是指DOS程序,你可以使用DOS INT 21 API,这比调用Win32要简单得多。我没有MASM,但这是一个简单的例子,如何阅读一个字符并写出一个字符。有关更多DOS功能,请参阅this

MOV AH,1  ; code for "read a character" 
INT 21H  ; character gets put in AL 

MOV AH,2  ; code for "write a character" 
MOV DL,'A'  ; ascii code goes in DL 
INT 21H 
+1

使用MASM32排除使用16位DOS API调用。 – 2010-04-28 05:05:58

+2

如果您使用LINK16而不是LINK,我相信您可以从MASM32目标文件生成16位DOS程序。 – 2010-04-29 00:58:59

0

下载,并链接到Irvine32库,他们会为你提供是非常人性化的输入和输出功能。