作者:潇潇 出处: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),每个双字变量占用二个连续的字单元(四个字节)。
该文章为本站原创,如有引用,请注明出处和作者
写作目的:
学了很多东西,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),每个双字变量占用二个连续的字单元(四个字节)。