入门系列:gdb学习——查看反汇编的输出结果,学习汇编

1️⃣ movl S,D 指令: mov为传送指令,将S传给D(S->D). l表示(unsigned) int / long / char*类型 = 4个字节。 -0x24(%ebp) 表示:从ebp寄存器中的地址值减去0x24后的地址值。 即i变量的地址。 故:movl $0xabcd,-0x24(%ebp)= i = 0xabcd; 2️⃣if语句: 2️⃣-1: cmpl S1,S2 指令: cmp为比较指令[compare],将S1与S2之间的差(S1-S2). 故cmpl $0x1234,-0x24(%ebp) = 0x1234-i 2️⃣-2: je Label 指令: je为条件跳转指令:若比较结果为0(相等)则跳转到Lable处。不满足则继续往下执行。 je 80484d7 2️⃣-4: jmp Label 指令: jmp为无条件跳转指令:直接跳转到Lable处。 3️⃣while语句: 3️⃣-1: addl S,D 指令: add为加法指令,将D+S并存入D中(S+D->D). 故addl $0x1,-0x24(%ebp)= i + 1 4️⃣函数调用: 4️⃣-1:call 指令:可跳转到函数后再返回。即此时会跳转到func()函数处。 4️⃣-2:可看出每次赋值都执行了两次,这是因为在32位操作系统上定义64比特变量都会这样。这是给局部变量进行赋值,以ebp寄存器的偏移量来表示,值写进了栈内的地址。 4️⃣-3:这边是给全局变量赋值,可看到这边地址的表示方法与上面局部变量的表示方法不同,是直接以地址值的形式。 5️⃣函数指针的调用: 调用函数指针func_op(),函数指针保存在eax中,要想*%eax这样加上星号(*) 6️⃣for循环: 6️⃣-3:lea &S,D 指令: lea为目的地址传送指令,将S的地址传入D寄存器中(&S–>D)【mov S,D的区别是lea是取S的地址】 6️⃣-6:movzbl &S,D 指令: 书中语句为movzbl -0x20(%ebp,%eax,1),%eax,-0x20(%ebp,%eax,1),此为伸缩化变址寻址含义:*( -0x20+ebp+eax*1) 对应程序中的(6️⃣-3)+(6️⃣-4)+(6️⃣-5)+(6️⃣-6)这四步。实现:将word(-0x20%ebp)的第i(%eax)位上1字节赋值给eax,也就是word=word[i] movzbl指令为零扩展,负责拷贝一个字节并用0填充气目的操作数中的其他位。 7️⃣范围值设置: return语句,给返回值赋0. return语句的返回值为int等4字节一下的情况,则要将返回值放到eax中,是以eax寄存器为通用寄存器的。

友情链接:
Copyright © 2022 86年世界杯_世界杯预选赛阿根廷 - fjyfzz.com All Rights Reserved.