VC 下的汇编实例

作者在 2010-07-02 23:04:03 发布以下内容
汇编一
void func()
{
    goto C_Dest;    /* 合法 */
    //goto c_dest;    /* 错误 */
    
    goto A_Dest;    /* 合法 */
    goto a_dest;    /* 合法 */
    
    __asm
    {
        JMP C_Dest  ; 合法
        ;JMP c_dest  ; MSDN上说合法,但是我在VS.NET中编译,认为这样不合法
            
        JMP A_Dest  ; 合法
        JMP a_dest  ; 合法
            
    a_dest:     ; __asm 标号
    }
    
C_Dest:     /* C的标号 */
        return;
}

int main()
{
    func();
    return 0;
}


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
汇编2
#include <stdio.h>

char szformat[] = "%s %s\n" ;
char szHello[] = "Hello" ;
char szWorld[] = "world" ;

void main()
{
    __asm
    {
        MOV EAX,OFFSET szWorld
        PUSH EAX
        MOV EAX,OFFSET szHello
        PUSH EAX
        MOV EAX,OFFSET szformat
        PUSH EAX
        CALL printf
        ; 内联汇编调用C函数必须自己清除堆栈
        ; 用不使用的EBX寄存器清除堆栈,或ADD ESP, 12
        POP EBX
        POP EBX
        POP EBX
    }
}

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;、
汇编3
#include<windows.h>

const char szAppName[] = "API Test" ;

MyProc proc
push ebp
mov ebp,esp
sub esp,8
mov eax,dword ptr[ebp+8]
sub eax,dword ptr[ebp+c]
add esp,8
pop ebp
ret 8
MyProc endp

void main()
{
    char szHello[]="Hello, world!" ;

    __asm
    {
        PUSH MB_OK OR MB_ICONINFORMATION
        PUSH OFFSET szAppName ; 全局变量用 OFFSET
        LEA EAX,szHello ; 局部变量用 LEA
        PUSH EAX
        PUSH 0
        CALL DWORD PTR[MessageBoxA]; 注意这里,我费了好大周折才发现不是CALL MessageBoxA
    }
    MyProc
}

汇编 | 阅读 1880 次
文章评论,共1条
ymwjz
2010-08-10 10:01
1
第三个程序不能编译!
游客请输入验证码
浏览1943124次