avatar

5.13日笔记 (week 4)

步入主题

接着昨天来吧,心态不好的昨天度过了后,今天继续更新吧!昨天大概说到了溢出的地方

小黄书更新

  • 进位

    无符号超出存储范围叫做进位,因为没有符号位,不会破坏数据,而多出的1位数据在进位标志为CF保存,数据产生了进位,只是进位后的1位数据1不在自身的存储空间,而在标志的CF位的位置,通过观察CF位来判断无符号的进位情况

  • 溢出

    有符号数超过存储的范围叫做溢出,因为数据进位,从而破坏了有符号的最高位——符号位,只有有符号数才有符号位,针对有符号数,可以查看溢出标志位OF,从而检查数据是否溢出

自增和自减

vc6.0 使用 ++ – 来实现自增自减的操作,一般形式分为两种,一种为自增运算符在语句块之后,另一种是自增运算符在语句块之前,如果在之前,先执行自增自减,在执行语句块,如果在之后,先执行语句块在自增自减,直接看汇编代码吧!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//自增自减代码
//C++源码说明:除法运算
//变量定义并出初始化
int nvarOne = argc;
int nvarTwo = argc;
//变量后缀自增参与表达式运算
nvarTwo = 5 + (nvarOne++);
//变量前缀自增参与表达式运算
nvarTwo = 5 + (++nvarOne);
//变量后缀自减参与表达式运算
nvarone = 5 + (nvarTwo--);
//变量前缀自减参与表达式运算
nvarone = 5 + (--nvarTwo);

//c++源码对应汇编
//变量对应初始化

//后缀自增运算
nvarTwo = 5 + (nvarTwo++);
//取出变量nvarOne,保存在edx中
0040BA34 mov edx,dword ptr [ebp-4]
//讲edx执行加等于5
0040BA37 add edx,5
//讲edx赋值给变量nvarTwo,可以看到没有对变量nvarOne执行自增操作
0040BA3A mov dword ptr [ebp-8],edx
//再次取出变量nvarOne数据存入eax中
0040BA3D mov eax,dword ptr [ebp-4]
//执行eax加等于1
0040BA40 add eax,1
将eax赋值给变量nvarOne,等同于对变量nvarOne执行自增1操作
0040BA43 mov dword ptr [ebp-4],ecx

//c++源码对比,前缀自增运算
nVarTwo = 5 + (++nvarOne);
//取出变量nvarOne数据放入ecx中
0040BA46 mov ecx,dword ptr [ebp-4]
//对ecx执行加等于1的操作
0040BA49 add ecx,1
//将ecx赋值给变量nvarOne,完成自增1操作
0040BA4C mov dword ptr [ebp-4],ecx
//取出变量nvarOne放到edx中
0040BA4F mov edx,dword ptr [ebp-4]
//对edx执行加等于5
0040BA52 add edx,5
//将结果edx赋值给变量nvarTwo
0040BA55 mov dword ptr [ebp-8],edx
//自增和自减差不多相同,add替换成sub就可

上面的汇编可以看出来,他们会把操作分离,nVarTwo = 5 + (nVarOne++) 会分解 nVarTwo = 5 + nVarOne,以及nVarOne +=1,同理,++在前的时候,两个算术表达式替换位置即可

关系运算和逻辑运算

关系运算用于判断两者之间的关系,大部分什么我就不说了,这里我只能说与非门牛逼,万能运算

  • 或运算:比较运算符 || 有一个值为真,就是真,如果是假,则返回假
  • 与运算:比较运算符&& 如果有一个为假就是假,都为真就是真
  • 非运算:改变运算符!真就是假,假就是真

关系运算和条件跳转的对应

指令助记符 检查标记位 说明
JZ ZF == 1 等于0则跳转
JE ZF == 1 相等则跳转
JNZ ZF == 0 不等于0则跳转
JNE ZF == 0 不相等则跳转
JS SF == 1 符号为负则跳转
JNS SF == 0 符号为正则跳转
JP/JPE PF == 1 "1"的个数为偶数则跳转
JNP/JPO PF == 0 "1"的个数为奇数则跳转
JO OF == 1 溢出则跳转
JNO OF == 0 无溢出则跳转
JC CF == 1 进位则跳转
JB CF == 1 小于则跳转
JNAE CF == 1 不大于等于则跳转
JNC CF == 0 无进位则跳转
JNB CF == 0 不小于则跳转
JAE CF == 0 大于则跳转

好的 吃饭喝酒去了- -!鸽了!😂

Author: L0x1c
Link: https://l0x1c.github.io/2020/05/13/2020-5-13/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶