#include
<
stdio.h
>
void main()
... {
wchar_t cFileName[] = L"c:/bin.bin";
FILE * pFile = _wfopen(cFileName,L"rb");
void* buffer[256];
int iSize = fread(buffer,1,1,pFile);
int iSize2 = fread(buffer,1,2,pFile);
fclose(pFile);
}
void main()
... {
wchar_t cFileName[] = L"c:/bin.bin";
FILE * pFile = _wfopen(cFileName,L"rb");
void* buffer[256];
int iSize = fread(buffer,1,1,pFile);
int iSize2 = fread(buffer,1,2,pFile);
fclose(pFile);
}
编译方式:Assembly with Source Code,Release版
TITLE c: emp_wfopen_wfopen.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC ' CODE '
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC ' DATA '
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC ' CONST '
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC ' BSS '
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC ' TLS '
_TLS ENDS
; COMDAT ?? _C@_1BG@FLEG@ ? $AAc ? $AA ? 3 ? $AA ? 2 ? $AAb ? $AAi ? $AAn ? $AA ? 4 ? $AAb ? $AAi ? $AAn ? $AA ? $AA@
_DATA SEGMENT DWORD USE32 PUBLIC ' DATA '
_DATA ENDS
; COMDAT ?? _C@_15CMLD@ ? $AAr ? $AAb ? $AA ? $AA@
_DATA SEGMENT DWORD USE32 PUBLIC ' DATA '
_DATA ENDS
; COMDAT _main
_TEXT SEGMENT PARA USE32 PUBLIC ' CODE '
_TEXT ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC _main
PUBLIC ?? _C@_1BG@FLEG@ ? $AAc ? $AA ? 3 ? $AA ? 2 ? $AAb ? $AAi ? $AAn ? $AA ? 4 ? $AAb ? $AAi ? $AAn ? $AA ? $AA@ ; ` string '
PUBLIC ?? _C@_15CMLD@ ? $AAr ? $AAb ? $AA ? $AA@ ; ` string '
EXTRN _fclose:NEAR
EXTRN _fread:NEAR
EXTRN __wfopen:NEAR ; // 打开文件函数
; COMDAT ?? _C@_1BG@FLEG@ ? $AAc ? $AA ? 3 ? $AA ? 2 ? $AAb ? $AAi ? $AAn ? $AA ? 4 ? $AAb ? $AAi ? $AAn ? $AA ? $AA@
; File c: emp_wfopen_wfopen.cpp
_DATA SEGMENT ; // 第一个参数,文件名-字符窜
?? _C@_1BG@FLEG@ ? $AAc ? $AA ? 3 ? $AA ? 2 ? $AAb ? $AAi ? $AAn ? $AA ? 4 ? $AAb ? $AAi ? $AAn ? $AA ? $AA@ DB ' c '
DB 00H, ' : ' , 00H, ' ', 00H, ' b ' , 00H, ' i ' , 00H, ' n ' , 00H, ' . ' , 00H
DB ' b ' , 00H, ' i ' , 00H, ' n ' , 00H, 00H, 00H ; ` string '
_DATA ENDS
; COMDAT ?? _C@_15CMLD@ ? $AAr ? $AAb ? $AA ? $AA@
_DATA SEGMENT ; // 第二个参数,读取方式-字符串
?? _C@_15CMLD@ ? $AAr ? $AAb ? $AA ? $AA@ DB ' r ' , 00H, ' b ' , 00H, 00H, 00H ; ` string '
_DATA ENDS
; COMDAT _main
_TEXT SEGMENT
_cFileName$ = - 1048
_buffer$ = - 1024
_main PROC NEAR ; COMDAT // main函数体
; 4 : ... {
sub esp, 1048 ; 00000418H
; 5 : wchar_t cFileName[] = L"c:/bin.bin";
mov ecx, 5
; 6 :
; 7 : FILE * pFile = _wfopen(cFileName,L"rb");
lea eax, DWORD PTR _cFileName$[esp+1048]
push esi ;//保存esi
push edi ;//保存edi
;//字符串存入源指针寄存器
mov esi, OFFSET FLAT:??_C@_1BG@FLEG@?$AAc?$AA?3?$AA?2?$AAb?$AAi?$AAn?$AA?4?$AAb?$AAi?$AAn?$AA?$AA@ ; `string'
;//文件名地址送目的指针寄存器
lea edi, DWORD PTR _cFileName$[esp+1056]
rep movsd ;//rep是字符串操作指令MOVS,CMPS等的前缀,在CX不等于0的情况下,对字符串执行重复操作.
push OFFSET FLAT:??_C@_15CMLD@?$AAr?$AAb?$AA?$AA@ ; `string' //第二个参数,读取方式
push eax ;//第一个参数
movsw ;//传送字,esi到edi
call __wfopen ;//调用_wfopen函数
mov esi, eax ;//返回地址送esi,注意函数返回值存在了eax
; 8 :
; 9 : void* buffer[256];
; 10 :
; 11 : int iSize = fread(buffer,1,1,pFile);
lea ecx, DWORD PTR _buffer$[esp+1064];//buffer地址存入ecx
push esi ;//第四个参数,_wfopen返回的文件句柄
push 1 ;//第三个参数
push 1 ;//第二个参数
push ecx ;//第一个参数,buffer地址
call _fread
; 12 :
; 13 : int iSize2 = fread(buffer,1,2,pFile);
push esi ;//第四个参数,文件句柄
push 2 ;//第三个参数
lea edx, DWORD PTR _buffer$[esp+1088] ;//另外一个buffer地址送edx
push 1 ;//第二个参数
push edx ;//第一个参数
call _fread
; 14 :
; 15 : fclose(pFile);
push esi ;//参数文件句柄
call _fclose
add esp, 44 ; 0000002cH
pop edi ;//恢复edi
pop esi ;//恢复esi
; 16 : }
add esp, 1048 ; 00000418H
ret 0
_main ENDP
_TEXT ENDS
END
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC ' CODE '
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC ' DATA '
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC ' CONST '
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC ' BSS '
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC ' TLS '
_TLS ENDS
; COMDAT ?? _C@_1BG@FLEG@ ? $AAc ? $AA ? 3 ? $AA ? 2 ? $AAb ? $AAi ? $AAn ? $AA ? 4 ? $AAb ? $AAi ? $AAn ? $AA ? $AA@
_DATA SEGMENT DWORD USE32 PUBLIC ' DATA '
_DATA ENDS
; COMDAT ?? _C@_15CMLD@ ? $AAr ? $AAb ? $AA ? $AA@
_DATA SEGMENT DWORD USE32 PUBLIC ' DATA '
_DATA ENDS
; COMDAT _main
_TEXT SEGMENT PARA USE32 PUBLIC ' CODE '
_TEXT ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC _main
PUBLIC ?? _C@_1BG@FLEG@ ? $AAc ? $AA ? 3 ? $AA ? 2 ? $AAb ? $AAi ? $AAn ? $AA ? 4 ? $AAb ? $AAi ? $AAn ? $AA ? $AA@ ; ` string '
PUBLIC ?? _C@_15CMLD@ ? $AAr ? $AAb ? $AA ? $AA@ ; ` string '
EXTRN _fclose:NEAR
EXTRN _fread:NEAR
EXTRN __wfopen:NEAR ; // 打开文件函数
; COMDAT ?? _C@_1BG@FLEG@ ? $AAc ? $AA ? 3 ? $AA ? 2 ? $AAb ? $AAi ? $AAn ? $AA ? 4 ? $AAb ? $AAi ? $AAn ? $AA ? $AA@
; File c: emp_wfopen_wfopen.cpp
_DATA SEGMENT ; // 第一个参数,文件名-字符窜
?? _C@_1BG@FLEG@ ? $AAc ? $AA ? 3 ? $AA ? 2 ? $AAb ? $AAi ? $AAn ? $AA ? 4 ? $AAb ? $AAi ? $AAn ? $AA ? $AA@ DB ' c '
DB 00H, ' : ' , 00H, ' ', 00H, ' b ' , 00H, ' i ' , 00H, ' n ' , 00H, ' . ' , 00H
DB ' b ' , 00H, ' i ' , 00H, ' n ' , 00H, 00H, 00H ; ` string '
_DATA ENDS
; COMDAT ?? _C@_15CMLD@ ? $AAr ? $AAb ? $AA ? $AA@
_DATA SEGMENT ; // 第二个参数,读取方式-字符串
?? _C@_15CMLD@ ? $AAr ? $AAb ? $AA ? $AA@ DB ' r ' , 00H, ' b ' , 00H, 00H, 00H ; ` string '
_DATA ENDS
; COMDAT _main
_TEXT SEGMENT
_cFileName$ = - 1048
_buffer$ = - 1024
_main PROC NEAR ; COMDAT // main函数体
; 4 : ... {
sub esp, 1048 ; 00000418H
; 5 : wchar_t cFileName[] = L"c:/bin.bin";
mov ecx, 5
; 6 :
; 7 : FILE * pFile = _wfopen(cFileName,L"rb");
lea eax, DWORD PTR _cFileName$[esp+1048]
push esi ;//保存esi
push edi ;//保存edi
;//字符串存入源指针寄存器
mov esi, OFFSET FLAT:??_C@_1BG@FLEG@?$AAc?$AA?3?$AA?2?$AAb?$AAi?$AAn?$AA?4?$AAb?$AAi?$AAn?$AA?$AA@ ; `string'
;//文件名地址送目的指针寄存器
lea edi, DWORD PTR _cFileName$[esp+1056]
rep movsd ;//rep是字符串操作指令MOVS,CMPS等的前缀,在CX不等于0的情况下,对字符串执行重复操作.
push OFFSET FLAT:??_C@_15CMLD@?$AAr?$AAb?$AA?$AA@ ; `string' //第二个参数,读取方式
push eax ;//第一个参数
movsw ;//传送字,esi到edi
call __wfopen ;//调用_wfopen函数
mov esi, eax ;//返回地址送esi,注意函数返回值存在了eax
; 8 :
; 9 : void* buffer[256];
; 10 :
; 11 : int iSize = fread(buffer,1,1,pFile);
lea ecx, DWORD PTR _buffer$[esp+1064];//buffer地址存入ecx
push esi ;//第四个参数,_wfopen返回的文件句柄
push 1 ;//第三个参数
push 1 ;//第二个参数
push ecx ;//第一个参数,buffer地址
call _fread
; 12 :
; 13 : int iSize2 = fread(buffer,1,2,pFile);
push esi ;//第四个参数,文件句柄
push 2 ;//第三个参数
lea edx, DWORD PTR _buffer$[esp+1088] ;//另外一个buffer地址送edx
push 1 ;//第二个参数
push edx ;//第一个参数
call _fread
; 14 :
; 15 : fclose(pFile);
push esi ;//参数文件句柄
call _fclose
add esp, 44 ; 0000002cH
pop edi ;//恢复edi
pop esi ;//恢复esi
; 16 : }
add esp, 1048 ; 00000418H
ret 0
_main ENDP
_TEXT ENDS
END