从高级语言到汇编1

作者:潇潇  出处:www.j2mefans.com
该文章为本站原创,如有引用,请注明出处和作者


写作目的:

学了很多东西,c,asm等等但不能做到融会贯通,想通过写来提高自己。而且在学汇编时深刻地感受到了汇编的障碍在于复杂,所以从熟悉的入手,一点点地深入,就像网上流传的《汇编语言的艺术》一书类似。第三,我也买了《深入理解计算机系统》一书,但没看完,在写作的使用,作为参考也可以系统的看一遍,不至于浪费。


第一篇  变量的长度及变量赋值

变量的赋值 变量赋值是给已声明的变量赋给一个特定值。
 一个简单的例子,对单个变量的赋值( 如果没有特殊的声明我们这里的变量都是指整型变量,毕竟浮点数要涉及浮点指令),这种变量在c语言中采用下列格式赋值
 变量名=表达式; 
例如:
 main() 

                int a,b,c;     /*定义局部整型变量a, b,c
    a=1;            /* 给变量a,赋值为1*/
    b=2;           /* 给变量a,赋值为1*/
    c=a+b;       /* 给变量a,赋值为1*/
    printf("%d/n",c);
    return 0;
}


用vc++6汇编出来的代码为:

8:        int a,b,c;
9:        a=1;

0040D708   mov         dword ptr [ebp-4],1             ;将1移动到变量a
10:       b=2;
0040D70F   mov         dword ptr [ebp-8],2              ; 将2移动到变量b
11:       c=a+b;
0040D716   mov         eax,dword ptr [ebp-4]          ;将变量a的值移动到寄存器eax
0040D719   add         eax,dword ptr [ebp-8]           ;将变量a的值加上变量b,结果放在eax
0040D71C   mov         dword ptr [ebp-0Ch],eax      ;将eax中的结果移动到变量c
12:       printf("%d/n",c);
0040D71F   mov         ecx,dword ptr [ebp-0Ch]
0040D722   push        ecx
0040D723   push        offset string "Hello World!/n" (0042201c)
0040D728   call        printf (00401060)
0040D72D   add         esp,8
13:       return 0;
0040D730   xor         eax,eax

从上面的代码中我们看到了,对于赋值语句如上所示:
9:        a=1;
0040D708   mov         dword ptr [ebp-4],1
在汇编中一个变量就代表一个内存地址(长度先不考虑),可以使用mov指令将一个立即数移动到变量中。

深入一:

关于mov指令,在汇编中叫做传送指令。
传送指令是使用最频繁的指令,它相对于高级语言里的赋值语句。指令的格式如下:
MOV  Reg/Mem, Reg/Mem/Imm
其中:Reg—Register(寄存器),Mem—Memory(存储器),Imm—Immediate(立即数),它们可以是8位、16位或32位。
指令的功能是把源操作数(第二操作数)的值传给目的操作数(第一操作数)。指令执行后,目的操作数的值被改变,而源操作数的值不变。

深入二:

变量类型,在高级语言中每一个变量都有其特定的类型,这样就可以在编译的使用告诉编译器给变量留多大的存储空间。而在汇编语言中是没有类型概念的,汇编语言只标示变量的长度。
字节变量的定义符为DB/BYTE(Define Byte),每个字节只占一个字节单元。
字变量的定义符为DW/WORD(Define Word),每个字占用两个连续的字节单元。
双字变量的定义符为DD/DWORD(Define Doubleword),每个双字变量占用二个连续的字单元(四个字节)。

在上面的程序中,我们将a,b,c三个变量都定义为int型。在默认的32位环境中,int类型的长度为4字节,所以我们可以看到在变量中设定的长度都为DD/DWORD(Define Doubleword),每个双字变量占用二个连续的字单元(四个字节)。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值