8086汇编语言
经过我这几年的工作,发现不学点底层的知识感觉心里很慌,我是看小码哥的视频学习的,发现有很多不错的知识要点,就在博客记录一下。写博客就拿出一种态度来不做抄袭别人知识的事情,只写自己亲手验证过的问题,下面就是一些概念,先这样写,以后我会慢慢优化;
语法格式&关键字说明:
1.mov ds:[0h],ax 如果你不写段地址,段地址的默认地址就是数据地址;mov [0h],ax 如果你想访问数据段里的某一个内容,你可以这样写;默认前面就是ds:
2.寄存器是寄存器,内存是内存;寄存器访问本来就快,它是在CPU内部
3.把数据放放到数据段,与放到全局变量是一样的;把返回值放到ax寄存器中;ax是16位能用寄存器;eax是32位的寄存器;rax是64位的寄存器;
4.word ptr 中的ptr指的是pointer;可以用寄存器,全局变量来传参;
5.ios 里面的传参是把参数放先放到寄存器中,寄存器不够用了,再放到栈里面,因为寄存器快
6.16位的cpu 栈一定会操作两个字节的;
7.bp是辅助栈使用的;不能直接使用sp+2 ,可以使用bp+2
8.在以前的认知中局部变量与参数 在函数调用完毕之后会自动消毁、销毁就是变成垃圾内存了;C语言里面的销毁是占用的内存变成垃圾内存了,不管那个内存了,以后别人要用的话可以拿去去用;这就相当于内存被释放了;不是内存*害坏;
9.函数调用前与函数调用后栈应该是一样的;add esp ,8 做了栈平衡
10.; 打印字符串
print:
; ds:dx告知字符串地址
mov dx, offset string
mov ah, 9h
int 21h
ret
函数的局部变量:
1.局部变量不是你要多少个就分配多少个内存,而是一次性分配一定的空间,分配多少个由我们来定,局部变量是在栈区不在数据区,数据区一般是存放全部变量、静态变量、常量;
2.先把sp的值赋值给bp mov bp,sp 然后再减10 , sub sp,10;如果sp不减10可能会被覆盖,只要sp指针一站在sp-10处,sp-10前面的空间别人就碰不了了,我们一调用call ,就会调用push操作把下一条要执行的执令入栈;如果局部变量往栈里面放数据直接用内存指令就好了;bp+8是参数 bp-8是局部变量;局部变量是夹在bp与sp之间
3.ax就是拿来给你赋值的,与函数返回值的,不用会保护,你保护是没有用的,ax是给别人用的;保护就要保护ax以外你要用的寄存器
4.寄存器是哪个函数都能用的,所以要保护一下si、di、dx、cx,保护你用到的寄存器
5.汇编里面是不允许内存对内存,一定要通过寄存器
函数的调用流程一:
; 函数的调用流程(内存)
; 1.push 参数
; 2.push 函数的返回地址
; 3.push bp (保留bp之前的值,方便以后恢复)
; 4.mov bp, sp (保留sp之前的值,方便以后恢复)
; 5.sub sp,空间大小 (分配空间给局部变量)
; 6.执行业务逻辑
; 7.mov sp, bp (恢复sp之前的值)
; 8.pop bp (恢复bp之前的值)
; 9.ret (将函数的返回地址出栈,执行下一条指令)
; 10.恢复栈平衡 (add sp,参数所占的空间)