学习计算机系统基础的心得
存储程序工作方式:就是把解决问题的指令提前存入存储器中,在机器通电之后,就能按照指定的逻辑循序取出存储器的指令进行处理自动的完成工作。
注意几个点
注意pf是低八位
注意变量前有无 $ 的含义
跳转指令 jz
和jnz
对于jz
当零符号位zf
为1的时候跳转
对于jnz
当零符号位zf
为0的时候跳转
jump if not zero
1 | section .data |
test
est命令将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。但是,Test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。
TEST AX,BX
与AND AX,BX
命令有相同效果,只是Test指令不改变AX和BX的内容,而AND指令会把结果保存到AX中。(intel)
将两个操作数进行按位AND,设结果是TEMP
- SF = 将结果的最高位赋给SF标志位,例如结果最高位是1,SF就是1
- 看TEMP是不是0,如果TEMP是0,ZF位置1;如果TEMP不是0,ZF位置0
- PF = 将TEMP的低8位,从第0位开始,逐位取同或。也就是第0位与第1位的同或结果,去和第2位同或,结果再去和第3位同或…直到和第7位同或。PF位是奇偶校验位,如果结果低8位中1的个数是偶数,PF=1;否则PF=0
- CF位置0
- OF位置0
给个例子:
这个可以判断
- 用于判断某一位是不是1
1 | test %eax, $0x4 ; $0x4 是二进制 100 对应的十六进制表示 |
- Test的一个非常普遍的用法是用来测试一方寄存器是否为空
1 | test %ecx, %ecx |
指令集合
直接寻址要注意的是
函数中的汇编实现
rbp
base point
ax寄存器来放返回值,
没有优化的话就会先把参数先放在 rbp
之前的栈空间
汇编过程调用
用户使用的空间是栈,从高地址向下分配
常量
对于一个常量,没有空间分配,没有地址,在编译之后,常量的数值就替换了程序中的常量符号,使用的话就当作立即数
ascii
文本 asciz
string
以0结尾 ,且用” “ 括起来的时候注意要是英文才行
imul
单操作数后面不能跟立即数
这是啥寻址
判断标志位的时候
通过公式将减法转换成加法,貌似不完全等价,但是对于有符号的话只看of就可以了,对于无符号也是这样
1 | 1、CF的判断 |
注意乘法的of和cf判断 乘法指令只改变of和cf
判断高位是不是低位符号拓展
除法指令啥也不改变
inc也不改变cf
leave指令
leave指令就是
1 | mov %ebp, %esp |
所以说前面分配空间的sub不用复原,啊啊啊
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Guohao!