-
.section .data label: .int 2,3,5
- int是32位
- label的值是地址,movl $label, %eax
-
.section .text .glbal _start _start:
-
寄存器
- %eax+5: 用addl $5, %eax,就是在eax中的值上+5,代表字节序列的那个址上+5
- 4(%eax): 括号代表取eax中的地址中的值,在其上面+4。所以如果要更新指向的int数组位置的话,就要+4了
- 通用寄存器有6个,abcd,esi,edi
-
sa,sh,移位指令
-
lea(和mov的区别是,lea不解引用),nop
-
64位系统给的栈地址是48位,很高,截到esp中用会有段错误
-
如果用64位
- 每次的push都是8字节
- rsp,rbp,rax,rdi
- rax放调用号,syscall唤起中断
- write调用号是1,rdi放写入文件号,rsi放字符串地址,rdx放长度
- exit调用号为60,返回值放rdi
-
hw5作业文件里有很多技巧,可以复习
-
函数传参
- 6个寄存器可以用,但是中间mov的时候可能会需要寄存器中转
- 64位除了abcd,di,si,bp,sp八个之外,还有8~15 8个寄存器可以用
- 用标号分清内外循环,弄清寄存器的功能
-
条件跳转
- test,按位与;com,a-b,或者-立即数
- 有符号数:jg,jl,jge,jle;无符号数:ja,jb,jae,jbe
-
32位/64位
- .code32,按32位编译
- 栈交流只能服从64位,push %rax,或者 .code32下用 pushl %eax,但是还是会编译成64位
- 过程调用
- 调用者push参数,call,被调用者切换栈帧(ebp压栈,后切为esp),也可以不切,直接用调用函数的栈帧
- 记好参数的顺序和位置
- 插入排序
- 维护子序列,遍历,找位置插入,
- 外层循环和内层循环各自的变量用不同的寄存器保存,内层循环不能碰外层的寄存器,就像不能修改外层的变量一样
- mov指令可能要用到中间寄存器
- 维护子序列,遍历,找位置插入,
网友评论