汇编应用学习0起步_001

 

#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);
}

编译方式: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值