8086汇编语言

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,参数所占的空间)

 

 

 

 

 

 

 

上一篇:8086寻址方式


下一篇:Nginx-服务跳转