字在内存中的存储方式:
8086——小端法
最低有效字节放在低内存单元
最高有效字节放在高内存单元
例如
从地址单元1取出
(1)一个字节数据 4EH
(2)字数据 124EH
(3)双字数据 2000124EH
一个内存单元 = 一个字节
字节(8bit)
字(16bit)
双字(32bit)
四字(64bit)
CPU与内存单元的传送
CPU要对内存进行读写,必须保存地址信息和数据信息的区域 -----存放于寄存器(地址寄存器、数据寄存器)https://www.cnblogs.com/hongjie-di/articles/9703692.html
1、内存单元地址用于存放汇编指令
地址寄存器组合
2、默认情况,8086自动取寄存器DS中的值为内存单元的段地址
如果想自定义的话 需要借助寄存器或者 内存单元
寄存器DS
DS :数据段寄存器,用于数据段【段地址】
简单指令操作形式
- 移动指令:
mov (4 3 2):
不能用于两个内存单元的数据交换,段寄存器之间以及常数之间不能用于交换
交换两个字节数据;
借助寄存器
mov ax,2000
mov ds,ax
mov al,[0]
借助内存单元
mov bl,[1]
mov [1] al
mov [0] bl
交换两个字数据:
mov ax, 2000
mov dx,ax
mov ax,[0]
mov bx [2]
mov [2],ax
mov [0],bx
2、运算指令 add 、sub
均无法与段寄存器进行数据交换,内存单元无法与内存单元自身进行交换。不能用于寄存器和段寄存器之间的交换 内存单元之间的交换
如何记住这些规则呢?
3、转移指令 jmp 指令,实现跳转,上一章简述过,这里不再赘述。
注意两操作位数要一致
栈
栈的特点:后进先出
两个概念:栈底、栈顶
对应关系:
入栈操作:栈顶-2= 栈底
当前栈顶:2FFFCH
在其上方插入:2FFFA处插入
出栈操作:栈顶+2=(新)栈顶
当前栈顶:2FFFCH
出栈下移:栈顶移至 2FFFEH
两个操作:入栈、出栈
操作单位:以字位存取单位。不能对常数进行操作
2FFFF 、2FFFD 依次往后利用小端法读取字单位数字
栈的寄存器
SS 存放栈段的 段地址
SP 栈顶的偏移地址
输入栈地址------通过寄存器转换,类似于数据段的给出方法,这里不再赘述。
push&pop 操作只需给出 偏移地址,默认的段地址在DS 中
栈的操作----特殊处理:
利用栈交换两个寄存器中的值;
当pop ax 时将后入栈的BX寄存器中的值推入ax寄存器中。下图就是实现将寄存器中的数据进行交换的演示
疑问我交换的是两个字数据吗?
栈越界:
栈已满再添加元素
栈已空再弹出元素
栈的保护机制:
将一些子段程序开始的位置保存在栈中。
什么是栈溢出、栈溢出有什么危害、黑客们可以利用栈溢出来进行什么样的攻击,他们是如何利用栈溢出来实现攻击的,以及如何防护他们的攻击。
程序在接受用户输入的时候不对下标越界
进行检查,直接将其保存到栈上,用户就有可能利用这个漏洞,输入足够多的、精心挑选的字符
,改写函数的返回地址
(也可以是jmp、call指令的跳转地址
),由此获取对cpu的控制
,从而执行任何他想执行的动作。摘自https://www.jianshu.com/p/47d484b9227e