我正在尝试使用CreateOutputFile
,WriteToFile
和CloseFile
Irvine32程序将双字数组写入磁盘文件。这是我的代码。
INCLUDE Irvine32.inc
.data
count = 45
BUFFER_SIZE = 188
filename BYTE "Fibonacci.txt",0
fileHandle DWORD ?
array DWORD 47 DUP(?)
num1 = 1
num2 = 1
temp1 DWORD ?
temp2 DWORD ?
.code
main PROC
mov edx,OFFSET filename
call CreateOutputFile
mov fileHandle,eax
mov esi,0
mov array[esi],num1
mov eax,array[esi]
mov temp1,eax
add esi,4
mov array[esi],num2
mov eax,array[esi]
mov temp2,eax
add esi,4
mov ecx, count
L1:
mov eax,0
mov ebx,0
mov eax,temp1
mov ebx,temp2
add eax,ebx
mov array[esi],eax
mov temp1,ebx
mov temp2,eax
add esi,4
loop L1
mov eax,fileHandle
mov edx,OFFSET array
mov ecx,BUFFER_SIZE
call WriteToFile
mov eax,fileHandle
call CloseFile
exit
main ENDP
END main
每次调试后,都会成功创建一个文本文件,但它会变成文本文件中一些无法识别的代码。我认为它应该是以十六进制显示的数组。
我真的不知道我在哪里犯错误。请帮我!谢谢!
答案 0 :(得分:1)
"无法识别的代码" 188字节代表CPU内部格式中的47个值,称为" DWORD"。该文件是array DWORD 47 DUP(?)
的内存转储。对于人类可读的格式,例如十进制字符串,它们必须在Fibonacci循环(L1)内逐个转换或使用新循环(梯形图在下面显示为L2)。 WinApi包含一个可用作转换例程的函数:wsprintf
。由于Irvine32库声明了这个函数,因此可以在没有其他情况下使用它。
示例:
INCLUDE Irvine32.inc
.data
count = 45
BUFFER_SIZE = 188
filename BYTE "Fibonacci.txt",0
fileHandle DWORD ?
array DWORD 47 DUP(?)
num1 = 1
num2 = 1
temp1 DWORD ?
temp2 DWORD ?
decimalstring BYTE 16 DUP(0) ; String for WriteFile
fmt BYTE "%u",13,10,0 ; Format string for wsprintf ("%u\r\n")
.code
main PROC
mov edx,OFFSET filename
call CreateOutputFile
mov fileHandle,eax
mov esi,0
mov array[esi],num1
mov eax,array[esi]
mov temp1,eax
add esi,4
mov array[esi],num2
mov eax,array[esi]
mov temp2,eax
add esi,4
mov ecx, count
L1:
mov eax,0
mov ebx,0
mov eax,temp1
mov ebx,temp2
add eax,ebx
mov array[esi],eax
mov temp1,ebx
mov temp2,eax
add esi,4
loop L1
mov ecx, LENGTHOF array ; Number of elements (DWORD's) in array
mov esi, 0 ; First index
L2:
push ecx ; Preserve loop counter
;convert number to string
push array[esi] ; Argument for format string
push OFFSET fmt ; Pointer to format string ("%d")
push OFFSET decimalstring ; Pointer to buffer for output
call wsprintf ; Irvine32.inc / Smallwin.inc / User.lib / User.dll
mov ecx, eax ; Length of the stored string into ECX for WriteToFile
add esp, (3*4) ; CCALL calling function! Adjust the stack.
mov eax, fileHandle
mov edx, OFFSET decimalstring
call WriteToFile
pop ecx ; Restore loop counter
add esi, 4 ; Next DWORD
loop L2
mov eax,fileHandle
call CloseFile
exit
main ENDP
END main
答案 1 :(得分:0)
这是一个老问题,但是,要查看您在文件上编写的数据,您需要使用HEX编辑器工具查看文件的HEX代码。我尝试调试你的代码并用十六进制编辑查看它,你的数组就在那里。 您可以从此处下载Hexedit:http://www.hexedit.com/ 或使用任何其他工具,允许您以十六进制模式查看文件。