我是程序集新手,我试图创建一个计数高达10,000的程序并退出。我使用FASM`程序集计数程序
include 'include/win32ax.inc'
.data
inchar DB ?
numwritten DD ?
numread DD ?
outhandle DD ?
inhandle DD ?
strFormat DB "Number %d ",0
strBuff RB 64
.code
start:
;set up console
invoke AllocConsole
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov [outhandle],eax
invoke GetStdHandle,STD_INPUT_HANDLE
mov [inhandle],eax
;loop starts here
mov eax, 0
LoopStart:
add eax,1
invoke wsprintf, strBuff, strFormat, eax ;convert number to String.
;the number eax is now in string form in strBuff
;find out the string length of strBuff
mov ecx,-1
mov al,0
mov edi,strBuff
cld
repne scasb
not ecx
dec ecx
;ecx is now the length.
invoke WriteConsole,[outhandle],strBuff,ecx,numwritten,0 ;write to console
;loop
cmp eax, 10000;loop compare
jne LoopStart;jump to start of loop
invoke ReadConsole,[inhandle],inchar,1,numread,0 ;give the user a chance to read console output before exit
invoke ExitProcess,0
.end start `
它应该打印1号2号3号等,而是将其打印数量2 2 2号2号2号等了一会儿,然后退出,无需等待用户输入。我的代码有什么问题?
编辑:我得到它的工作!工作代码:
include 'include/win32ax.inc'
.data
inchar DB ?
numwritten DD ?
numread DD ?
outhandle DD ?
inhandle DD ?
strFormat DB "Number %d ",0
strBuff RB 64
number DD ?
.code
start:
;set up console
invoke AllocConsole
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov [outhandle],eax
invoke GetStdHandle,STD_INPUT_HANDLE
mov [inhandle],eax
;loop starts here
mov eax, 0
LoopStart:
add eax,1
mov [number],eax
mov edi, eax
push eax
invoke wsprintf, strBuff, strFormat, edi ;convert number to String.
add esp, 4 * 3
pop eax
;the number eax is now in string form in strBuff
;find out the string length of strBuff
mov ecx,-1
mov al,0
mov edi,strBuff
cld
repne scasb
not ecx
dec ecx
;ecx is now the length.
push eax
invoke WriteConsole,[outhandle],strBuff,ecx,numwritten,0 ;write to console
pop eax
;loop
mov eax, [number]
cmp eax, 10000;loop compare
jne LoopStart;jump to start of loop
invoke ReadConsole,[inhandle],inchar,1,numread,0 ;give the user a chance to read console output before exit
invoke ExitProcess,0
.END开始
打印将破坏EAX中的值。调用其他函数时必须保存并恢复它。 – 2013-03-16 15:42:12
@BoPersson这将如何完成?我尝试在内存位置123存储eax并在打印后恢复它,但我的程序说:Test.exe遇到错误,需要关闭。我们对这种不便表示抱歉。 – user2097804 2013-03-16 15:46:01
@ user2097804你为什么要写内存地址'123'?首先,你是如何知道该内存地址不包含某些代码或数据的?然后,你写入特定内存地址的动机是什么?你似乎没有用'malloc'或类似的东西来保留任何内存。可能操作系统不会给你写入该内存地址的权利,因此试图导致分段错误。 – nrz 2013-03-16 15:56:49