• 【编译原理笔记】抽象语法树翻译为汇编语言


    https://blog.csdn.net/weixin_30470643/article/details/95003324

    一、加法指令 ADD(Addition) 格式
    格式: ADD A,B   //A=A+B;
    功能: 两数相加
    
    1. OPRD1为任一通用寄存器或存储器操作数,可以是任意一个通用寄存器,而且还可以是任意一个存储器操作数.
      OPRD2为立即数,也可以是任意一个通用寄存器操作数.立即数只能用于源操作数B.
    2. A和B均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的, 但不允许两个都是存储器操作数.
     //也就是说A与B不能同时是指针 如: add [eax],[ebx] 这类情况是错的
    例子:
    第三课中的add函数里 有如下2句代码
    00401003  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]             ;  a
    00401006  |.  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]             ;  b //eax=a+b
    
    二、ADD指令测试
    int _tmain(int argc, _TCHAR* argv[])
    {
        int i=0;
        printf("");
    
        i=i+0x100;
        i=i+0x111;
    
        int *p=&i;
        __asm 
        {
            mov eax,0x222
            mov ebx,0x100
            add ebx,eax //ebx322
            //
            mov ebx,p
            add [ebx],0x111 //00401048  |.  8003 11       ADD BYTE PTR DS:[EBX],11                 ;  i=i+11
            add i,0x111     //DWORD WORD
        }
        /*
        0040101C  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  eax=i=0
        0040101F  |.  05 00010000   ADD EAX,100                              ;  eax=eax+100=0+100=100
        00401024  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX             ;  i=eax=100
        00401027  |.  8B4D F8       MOV ECX,DWORD PTR SS:[EBP-8]             ;  ecx=i=100
        0040102A  |.  81C1 11010000 ADD ECX,111                              ;  ecx=ecx+111=100+111=0x211
        00401030  |.  894D F8       MOV DWORD PTR SS:[EBP-8],ECX             ;  i=ecx=0x211
        00401033  |.  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]             ;  edx=&i=ebp-8;
        00401036  |.  8955 FC       MOV DWORD PTR SS:[EBP-4],EDX             ;  p=&i
        00401039  |.  B8 22020000   MOV EAX,222
        0040103E  |.  BB 00010000   MOV EBX,100
        00401043  |.  03D8          ADD EBX,EAX                              ;  ebx=ebx+eax=100+222=322
        00401045  |.  8B5D FC       MOV EBX,DWORD PTR SS:[EBP-4]             ;  ebx=i=edx=ebp-8
        00401048  |.  8003 11       ADD BYTE PTR DS:[EBX],11                 ;  i=i+11
        0040104B  |.  8145 F8 11010>ADD DWORD PTR SS:[EBP-8],111             ;  i=i+111
    
        */ 
    
        printf("");
        return 0;
    }
  • 相关阅读:
    新东方英语学习方法
    最易遭老板“炒”的15种员工
    如何阅读代码
    Window 消息大全使用详解
    英语学习的六大原则
    单用户多角色权限的MSSQL实现
    .Net中的5种事务总结
    一个.Net程序员关于学习的思考顺带思考人生
    Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
    推荐几个win8系统下载比较好的网站
  • 原文地址:https://www.cnblogs.com/jiftle/p/16198314.html
Copyright © 2020-2023  润新知