.386
.model flat, stdcall
option casemap :none ; 选择大小写转换方式
include \masm32\include\windows.inc ; 引入 Windows API 头文件
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\user32.lib ; 引入 Windows API 库文件
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
prompt db 'Enter a set of alphanumeric characters (up to 6):', 0 ; 提示信息
result db 'The subsets of the input set are:', 0 ; 头部信息
buffer db 7 dup (?) ; 存储用户输入集合的缓冲区
format db '%s', 0 ; 输出格式
newline db 0Ah, 0 ; 换行符
.code
; 定义获取下一个子集的子程序 getnextsubset
; 输入:
; eax = 当前子集
; ecx = 当前集合中元素个数
; 输出:
; eax = 下一个子集
getnextsubset PROC
push edx ; 保存寄存器值,防止影响其他子程序调用
; 计算下一个子集
xor edx, edx
mov ebx, eax
xor eax, eax
inc eax
nextbit:
shl eax, 1
jz done
; 如果某位为 0,则设置该位为 1
mov edx, ecx
sub edx, 1
bts eax, edx
jnc nextbit
nextelem:
; 输出当前字母
xor edx, edx
inc ecx
bt eax, ecx - 1
jnc skip
mov dl, buffer[ecx - 1]
push edx
invoke printf, ADDR format, edx
pop edx
skip:
cmp ecx, 6
jne nextelem
done:
pop edx ; 恢复寄存器值
ret
getnextsubset ENDP
main PROC
; 显示提示信息
invoke StdOut, ADDR prompt
; 获取用户输入的集合
invoke StdIn, ADDR buffer, 7
mov ecx, 1
; 显示所有子集的头部信息
invoke StdOut, ADDR newline
invoke StdOut, ADDR result
invoke StdOut, ADDR newline
; 遍历所有子集,并逐一输出
mov eax, 0
mov esi, OFFSET buffer
loop1:
call getnextsubset
jnz loop1
; 显示所有子集的尾部信息
invoke StdOut, ADDR newline
; 退出程序
invoke ExitProcess, 0
main ENDP
END main
windows.in?
应该是windows.inc,是不是少了c