image-20240228195728567

image-20240228200332571

存储程序工作方式:就是把解决问题的指令提前存入存储器中,在机器通电之后,就能按照指定的逻辑循序取出存储器的指令进行处理自动的完成工作。

image-20240228200408653

image-20240310203449740

image-20240310203506531

image-20240310203525256

image-20240310203540438

image-20240318220051163

image-20240318222400279

image-20240319211615226

image-20240319220857952

注意几个点

image-20240321073010408

image-20240321073226635

image-20240321073450421

image-20240321074021779

image-20240321074036549

image-20240321075451713

注意pf是低八位

image-20240321090457053

image-20240321090701447

image-20240321090924934

image-20240321091010935

image-20240321091032732

image-20240321091534553

image-20240321091852621

image-20240321091923043

image-20240321092328767

注意变量前有无 $ 的含义

跳转指令 jzjnz

对于jz 当零符号位zf为1的时候跳转

对于jnz当零符号位zf为0的时候跳转

jump if not zero

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
section .data
num1 db 10
num2 db 10

section .text
global _start

_start:
mov al, [num1]
mov bl, [num2]
cmp al, bl
jz equal ; 如果相等,跳转到equal标签处
jmp not_equal ; 否则跳转到not_equal标签处

equal:
; 相等的处理逻辑
mov eax, 1
mov ebx, 0
int 0x80

not_equal:
; 不相等的处理逻辑
mov eax, 0
mov ebx, 1
int 0x80

test

est命令将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。但是,Test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。

TEST AX,BXAND AX,BX命令有相同效果,只是Test指令不改变AX和BX的内容,而AND指令会把结果保存到AX中。(intel)

将两个操作数进行按位AND,设结果是TEMP

  1. SF = 将结果的最高位赋给SF标志位,例如结果最高位是1,SF就是1
  2. 看TEMP是不是0,如果TEMP是0,ZF位置1;如果TEMP不是0,ZF位置0
  3. PF = 将TEMP的低8位,从第0位开始,逐位取同或。也就是第0位与第1位的同或结果,去和第2位同或,结果再去和第3位同或…直到和第7位同或。PF位是奇偶校验位,如果结果低8位中1的个数是偶数,PF=1;否则PF=0
  4. CF位置0
  5. OF位置0

给个例子:

这个可以判断

  • 用于判断某一位是不是1
1
2
test %eax, $0x4 ; $0x4 是二进制 100 对应的十六进制表示  
jne ****** ; 如果eax右数第三个位为1,jne将会跳转
  • Test的一个非常普遍的用法是用来测试一方寄存器是否为空
1
2
test %ecx, %ecx
jz somewhere

指令集合

image-20240322134552483

image-20240322134606797

直接寻址要注意的是

image-20240322150841082

函数中的汇编实现

rbp base point

image-20240323181111197

image-20240323180911733

ax寄存器来放返回值,

image-20240323181258097

image-20240323181827697

image-20240323182834172

没有优化的话就会先把参数先放在 rbp 之前的栈空间

汇编过程调用

image-20240324220043002

image-20240324220217164

用户使用的空间是栈,从高地址向下分配

image-20240324221757541

image-20240324222950327

image-20240324224508628


常量

对于一个常量,没有空间分配,没有地址,在编译之后,常量的数值就替换了程序中的常量符号,使用的话就当作立即数

ascii 文本 asciz string 以0结尾 ,且用” “ 括起来的时候注意要是英文才行

imul 单操作数后面不能跟立即数

image-20240404210659624

这是啥寻址

判断标志位的时候

通过公式将减法转换成加法,貌似不完全等价,但是对于有符号的话只看of就可以了,对于无符号也是这样

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
1、CF的判断

①加法

十进制角度,如果两无符号数相加,结果大于2^n-1(n为位数),则CF=1,否则CF=0;

二进制角度,如果两无符号数相加,最高位向前有进位,则CF=1,否则CF=0。

②减法

十进制角度,如果两无符号数相减,减数大于被减数(也即结果不在0—2^n-1内),则CF=1,否则CF=0;

二进制角度,如果两无符号数相减,最高位向前游借位,则CF=1,否则CF=0。

2、OF的判断

①加法

十进制角度,如果两有符号数相加,结果不在-2^(n-1)~2^(n-1)-1内,则OF=1,否则OF=0;

二进制角度,如果两有符号数同号,而相加结果与之异号,则OF=1,否则OF=0。

②减法

十进制角度,如果有符号数相减结果在-2^(n-1)~2^(n-1)-1内,则OF=1,否则OF=0;

二进制角度,如果两个数异号,而相减结果与被减数符号相反,则OF=1,否则OF=0。

注意乘法的of和cf判断 乘法指令只改变of和cf

判断高位是不是低位符号拓展

除法指令啥也不改变

image-20240404220650905

inc也不改变cf

leave指令
leave指令就是

1
2
mov %ebp, %esp
pop %ebp

所以说前面分配空间的sub不用复原,啊啊啊