常用汇编指令

lea 加载有效地址

​ lea eax, [ebx+8] 将ebx+8存储的内存地址 +8 传给eax

​ mov eax, [ebx+8] 将ebx+8内存地址指向的数据 传给eax

cmp

算数运算

sub 减

add 加

inc +1

dec -1

mul 乘

div 除

条件指令及跳转指令

https://blog.csdn.net/counsellor/article/details/81005101

jmp 无条件跳转 p74-76

这几个都是根据标志位跳转

jz 如果ZF标志位置位则跳转 等于

jnz 如果ZF标志位被清除则跳转 不等于

je 等于跳转

jg 有符号大于则跳转

test eax,eax 检测目标值是否为0 ,即两个操作数按位与运算,为0的话设置标志位ZF为1,否则为0(不修改使用的操作数)

cmp eax,ebx 如果两个参数相等,ZF标志位置位

一般在cmp指令后用je,test指令后用jz

函数使用的

call

leave

enter

ret

https://www.codenong.com/10483544/

全局变量与局部变量

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int i = 1;

int main()
{
int j =2;
printf("this is:%d %d\n",i,j);
return 0;

}

image-20230303215108473

全局变量i通过内存地址引用,局部变量通过栈地址引用

算数运算

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main()
{
int i = 10;
int j=2;
int k;
i = i +2;
k = i/j;
printf("this is:%d %d %d\n",i,j,k);
return 0;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.text:000000000000064A                 push    rbp
.text:000000000000064B mov rbp, rsp
.text:000000000000064E sub rsp, 10h
.text:0000000000000652 mov [rbp+var_C], 0Ah ; int i =10
.text:0000000000000659 mov [rbp+var_8], 2 ;int j=2;
.text:0000000000000660 add [rbp+var_C], 2 ; i = i +2;
.text:0000000000000664 mov eax, [rbp+var_C] ; 把i放到eax中当作被除数
.text:0000000000000667 cdq
.text:0000000000000668 idiv [rbp+var_8] ;j是除数
.text:000000000000066B mov [rbp+var_4], eax ;结果放到k中
.text:000000000000066E mov ecx, [rbp+var_4] ;k
.text:0000000000000671 mov edx, [rbp+var_8] ;j
.text:0000000000000674 mov eax, [rbp+var_C] ;i
.text:0000000000000677 mov esi, eax ;i
.text:0000000000000679 lea rdi, format ; "this is:%d %d %d\n"

识别if语句

• if语句的结构

​ – if语句主要由判断语句和跳转语句构成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main()
{
int i = 3;

if(i == 3)
{
printf(" this is 3");
}else{
printf(" this is not 3");
}

return 0;

}

image-20230306155253463

image-20230306155311814

识别循环

for和while循环差距不大

for循环的4个组件

​ – 初始化、比较、执行指令、递增或递减

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main()
{
int n = 0;
for(int i=1;i<101;i++)
n += i;

printf("the sum is: %d\n",n);
return 0;

}

image-20230306160758436

识别结构体

问题

一开始执行的是什么玩意??