寄存器 (内存访问)

字在内存中的存储方式:

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 :数据段寄存器,用于数据段【段地址】

简单指令操作形式

  1. 移动指令:

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

posted on 2018-11-05 09:10 nilininimini 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/hongjie-di/p/9800204.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值