将数组写入磁盘文件的汇编程序

时间:2012-09-20 16:04:04

标签: assembly x86 masm irvine32

我正在尝试使用CreateOutputFileWriteToFileCloseFile 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

每次调试后,都会成功创建一个文本文件,但它会变成文本文件中一些无法识别的代码。我认为它应该是以十六进制显示的数组。

我真的不知道我在哪里犯错误。请帮我!谢谢!

2 个答案:

答案 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/ 或使用任何其他工具,允许您以十六进制模式查看文件。