汇编语言(二)

段的概念

内存没有分段,段的划分来自CPU。

在编程时可以根据需要,将若干地址连续的内存单元看作一个段。

8086CPU可将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。(其为16位CPU)

段寄存器

CS&IP

CS为代码段寄存器;IP为指令指针寄存器;

寄存器与指令关系:8086机中,任意时刻,CPU将CS:IP指向内容当做指令执行

在这里插入图片描述

修改CS、IP的指令

最简单修改CS、IP的指令:jmp指令。

  • 同时修改CS、IP的内容:jmp 段地址:偏移地址。如:

    jmp 2ae3:3:CS=2ae3h、IP=0003h,CPU将从2ae33H读取指令

  • 仅修改IP内容:jmp 某一合法寄存器。如:

    jmp ax:执行指令前 ax=1000H,CS=2000H,IP=0003H。执行指令后:AX=1000H,CS=2000H,IP=1000H

代码段

可根据需要将一组内存单元定义为一个段。将长度N(<=64kb(对于8086))的一组代码,存在一组地址连续、起始地址为16倍数的内存单元中。

要让CPU执行代码段,必须将CS:IP指向所定义的代码段的第一条指令的首地址,CPU只认被CS:IP指向的内存单元的中的内容为指令。

Debug

R命令

查看、改变CPU寄存器的内容

  • r查看寄存器内容

    [外链图片转存失败(img-IXysYMHj-1564904179112)(https://i.loli.net/2019/07/30/5d3fb8714074f10241.png)]

  • r [寄存器名]修改寄存器内容

D命令

查看内存中内容

  • d [段地址]:[偏移地址]。列出指定内存单元开始的128个内存单元的内容;每行16个。

    右侧为对应可现实的ASCII码字符,若无则显示.

  • d [段地址]:[偏移地址] [结尾偏移地址]。列出指定内存单元开始的指定个数内存单元的内容

E命令

改写内存中的内容

  • e [起始地址] [*数据组]

    写入数值

    [外链图片转存失败(img-xLYKTtU8-1564904179114)(https://i.loli.net/2019/07/30/5d3fbb35d231f74609.png)]

    写入字符串

    写入机器码

  • e [起始地址]。问答式修改方式

    [外链图片转存失败(img-5TpTPGMX-1564904179116)(https://i.loli.net/2019/07/30/5d3fbb6ca513321874.png)]

U命令

将内存单元中的内容翻译为汇编指令显示

  • u [起始地址]

T命令

执行一条或多条指令;若用T命令控制CPU执行我们写的指令,确保CS:IP指向了对应的内存单元。

A命令

用Debug的A命令以汇编指令的形式在内存中写入机器指令

  • a [起始地址]

寄存器(内存访问)

内存中字的存储

字单元:存放一个字符型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。

起始地址为N的字单元简称为N地址字单元。

地址单元:一个内存单元;地址字单元:两个内存单元;

DS&[address]

段地址默认存放在ds寄存器

DS是CPU中的一个寄存器;存放要访问数据的段地址;不能使用mov直接传入段地址,需要传入一个寄存器获取寄存器的段地址;

读取内存:

写入内存:

[外链图片转存失败(img-2GV2xcZK-1564904179117)(https://i.loli.net/2019/07/30/5d402ed38fe2869289.png)]

字的传送

8086CPU是16位结构,有16根数据线,可以一次传送16位数据,即一次性传送一个字。

[外链图片转存失败(img-v1Oxe4fL-1564904329159)(https://i.loli.net/2019/07/30/5d405e79a391e94126.png)]

[外链图片转存失败(img-H1lm2Y8Q-1564904339140)(https://i.loli.net/2019/07/30/5d405f26caa0539685.png)]

mov、add、sub指令

除了以上几种还有诸如mov 段寄存器,寄存器mov 内存单元,寄存器mov 段寄存器,内存单元

(同上说明)

数据段

前文提及,可根据需要将一组内存单元定义一个段,将一组长度为N、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,称为数据段。

# 累加数据段中的前3个字型数据
mov ax,123bh
mov ds,ax
mov ax,0
add ax,[0]
add ax,[1]
add ax,[2]
add ax,[4]

栈是一个种距有特殊的访问方式的存储空间,先进后出。

CPU提供的栈机制

8086CPU提供入栈和出栈指令,最基本两个是push(入栈)pop(出栈)。出入栈操作都是以字为单位。

字型数据用两个单元存放,高地址单元存放高8位,低地址单元存放低8位

8086CPU中的段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。

入栈时,栈顶从高地址向低地址方向增长,即sp=sp-2。

当栈为空的时候,SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2

在这里插入图片描述

pop出栈之后原栈顶数据依然存在,但不在栈中;如果push入栈原栈顶会被覆盖

[外链图片转存失败(img-s9sPfCLM-1564904179119)(C:\Users\SkYe\AppData\Roaming\Typora\typora-user-images\1564757583557.png)]

栈顶超界问题

push、pop指令

  • push指令的执行步骤:1.SP=SP-2 2.向SS:SP指向的字单元送入数据

    pop指令的执行步骤:1.从SS:SP指向的字单元中读取数据 2.SP=SP+2

  • 栈空间是内存空间的一部分。

  • push、pop可以在寄存器和内存:push 寄存器;将一个寄存器中的数据入栈pop 寄存器;出栈,用一个寄存器接收出栈的数据

    push、pop可以在段寄存器和内存:push 段寄存器;将一个段寄存器中的数据入栈pop 段寄存器;出栈,用一个段寄存器接收出栈的数据

    push、pop可以在内存和内存:push 内存单元;将一个内存字单元出的字入栈pop 内存单元;出栈,用一个内存字单元接收出栈数据

栈段

可根据需要将一组内存单元定义为一个段,也可将长度为n(n小于64kb)的一组地址连续、起始地址为16倍数的内存空间当做栈空间使用,以栈的方式访问,这段空间称为栈段

实验二

  • D、E、A、U命令可以使用d 段寄存器:偏移地址

  • 单步运行t在某些情况下会不止运行一行命令,如

    mov ss,ax
    mov sp,10
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值