汇编语言问题
0x00401009处把ecx+eax+78处的地址赋给edx干嘛?不应该是ecx+eax+78的值赋给edx的吗?还有这个函数的局部变量本来就都放到寄存器里了,0041...
0x00401009处把ecx+eax+78处的地址赋给edx干嘛?不应该是ecx+eax+78的值赋给edx的吗?还有这个函数的局部变量本来就都放到寄存器里了,00410001处为什么还要为局部变量开辟空间?
展开
展开全部
c的main函数中的局部变量a b没有被赋初值呢
对应的汇编代码中int a b用的是同一个内存空间,即push ecx这条指令开辟的那一个4字节栈空间
mov eax, [esp] ; eax= a
mov ecx, [esp] ; ecx = b
lea edx, [ecx + eax+78] ; edx = ecx+edx+78 = a+b+78
lea指令经常用来做多个寄存器值的加减,比add sub精简,如
lea edx, dword ptr [ecx + eax+78]取dword内存单元[ecx+eax+78]的地址,也即 ecx值+eax值+78
到edx,执行完后 edx = ecx值+eax值+78,用add来做相同的计算:
mov edx, ecx
add edx, eax
add edx, 78 显得麻烦多了
“还有这个函数的局部变量本来就都放到寄存器里了,00410001处为什么还要为局部变量开辟空间”
这个问题呢 是由编译器的逻辑决定的,我的看法呢 main函数中的int a, b;是函数的局部变量,对应的是栈内存,分配栈内存空间给它们是很正常的。
最后,我好奇的问一下,图片截的是某本书的内容吧?是什么书啊?
对应的汇编代码中int a b用的是同一个内存空间,即push ecx这条指令开辟的那一个4字节栈空间
mov eax, [esp] ; eax= a
mov ecx, [esp] ; ecx = b
lea edx, [ecx + eax+78] ; edx = ecx+edx+78 = a+b+78
lea指令经常用来做多个寄存器值的加减,比add sub精简,如
lea edx, dword ptr [ecx + eax+78]取dword内存单元[ecx+eax+78]的地址,也即 ecx值+eax值+78
到edx,执行完后 edx = ecx值+eax值+78,用add来做相同的计算:
mov edx, ecx
add edx, eax
add edx, 78 显得麻烦多了
“还有这个函数的局部变量本来就都放到寄存器里了,00410001处为什么还要为局部变量开辟空间”
这个问题呢 是由编译器的逻辑决定的,我的看法呢 main函数中的int a, b;是函数的局部变量,对应的是栈内存,分配栈内存空间给它们是很正常的。
最后,我好奇的问一下,图片截的是某本书的内容吧?是什么书啊?
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
汇编语言(assembly language)是面向机器的程序设计语言.汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言”作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询