mov eax, DWORD PTR [ebp+12]对内存地址举例说明
时间: 2024-01-04 18:04:54 浏览: 133
假设我们有一段内存,其起始地址为0x1000,我们想在其中存储一个32位的数字,比如0x12345678。现在我们要用汇编指令把这个数字存储到内存中。
首先,我们需要指定要存储的数字的内存地址。假设我们想把这个数字存储在内存地址0x1004处(即起始地址0x1000加上偏移量4),我们可以使用以下汇编代码:
mov eax, 0x12345678
mov DWORD PTR [0x1004], eax
这段代码的第一行把0x12345678存储到EAX寄存器中。接着,第二行使用了“MOV DWORD PTR”指令,把EAX寄存器中的值存储到内存地址0x1004处。注意,使用“DWORD PTR”指令是为了告诉汇编器要存储一个32位的数字,而不是8位或16位。
现在,如果我们想把内存地址存储到EBP+12的位置,我们可以使用以下汇编代码:
lea eax, [0x1004] ; 将0x1004的地址存储到EAX寄存器中
mov DWORD PTR [ebp+12], eax ; 将EAX寄存器中的值存储到EBP+12的位置
这段代码的第一行使用了LEA指令,把内存地址0x1004存储到EAX寄存器中。接着,第二行使用了“MOV DWORD PTR”指令,把EAX寄存器中的值存储到EBP+12的位置。注意,使用“DWORD PTR”指令是为了告诉汇编器要存储一个32位的地址,而不是8位或16位。
相关问题
mov eax, DWORD PTR [ebp+12] movzx edx, BYTE PTR [eax] mov eax, DWORD PTR [ebp+8] mov BYTE PTR [eax], dl在汇编中的作用
这段汇编代码的作用是:将存储在EBP+12地址处的DWORD值(32位整数)作为地址取出一个字节,并将其扩展为双字(32位)存储在EDX寄存器中;将存储在EBP+8地址处的DWORD值(32位整数)作为地址取出一个字节,并将其存储在EAX寄存器中;将EDX寄存器中的双字(32位)的低8位存储在EAX寄存器指向的地址处。
换言之,这段汇编代码的作用是将一个DWORD值(32位整数)的低8位复制到另一个DWORD值(32位整数)中的低8位。
将以下子程序反汇编的每一层说明解释:00401020 push ebp 00401021 mov ebp,esp 00401023 sub esp,40h 00401026 push ebx 00401027 push esi 00401028 push edi 00401029 lea edi,[ebp-40h] 0040102C mov ecx,10h 00401031 mov eax,0CCCCCCCCh 00401036 rep stos dword ptr [edi] 9: 10: return a*a+b*b; 00401038 mov eax,dword ptr [ebp+8] 0040103B imul eax,dword ptr [ebp+8] 0040103F mov ecx,dword ptr [ebp+0Ch] 00401042 imul ecx,dword ptr [ebp+0Ch] 00401046 add eax,ecx 11: 12: } 00401048 pop edi 00401049 pop esi 0040104A pop ebx 0040104B mov esp,ebp 0040104D pop ebp 0040104E ret
这段代码是一个带有参数的函数,函数的返回值是 a*a+b*b。以下是每条指令的解释:
00401020 push ebp ; 保存当前栈底指针
00401021 mov ebp,esp ; 设置新的栈底指针
00401023 sub esp,40h ; 为局部变量分配空间
00401026 push ebx ; 保存 ebx 寄存器的值
00401027 push esi ; 保存 esi 寄存器的值
00401028 push edi ; 保存 edi 寄存器的值
00401029 lea edi,[ebp-40h] ; 将 edi 寄存器设置为局部变量的地址
0040102C mov ecx,10h ; 将 ecx 寄存器设置为 16
00401031 mov eax,0CCCCCCCCh; 将 eax 寄存器设置为 0xcccccccc
00401036 rep stos dword ptr [edi] ; 将 dword ptr [edi] 的值设置为 eax,重复 ecx 次,即初始化局部变量为 0xcccccccc
9: 10: return a*a+b*b;
00401038 mov eax,dword ptr [ebp+8] ; 将 eax 寄存器设置为函数参数 a 的值
0040103B imul eax,dword ptr [ebp+8] ; 将 eax 寄存器与函数参数 a 的值相乘
0040103F mov ecx,dword ptr [ebp+0Ch] ; 将 ecx 寄存器设置为函数参数 b 的值
00401042 imul ecx,dword ptr [ebp+0Ch] ; 将 ecx 寄存器与函数参数 b 的值相乘
00401046 add eax,ecx ; 将 eax 寄存器与 ecx 寄存器的值相加,即计算 a*a+b*b
11: 12: }
00401048 pop edi ; 恢复 edi 寄存器的值
00401049 pop esi ; 恢复 esi 寄存器的值
0040104A pop ebx ; 恢复 ebx 寄存器的值
0040104B mov esp,ebp ; 恢复栈顶指针
0040104D pop ebp ; 恢复栈底指针
0040104E ret ; 返回 a*a+b*b 的值
阅读全文