汇编语言王爽老师第四版(寄存器解读与实验二)

  • Post author:
  • Post category:其他




内存中字的存储


汇编语言所有实验链接

CPU中用16位(2bytes)进行存储字,16位分为高8位和低8位。

例如:

  • 0 20H
  • 1 4EH
  • 2 12H
  • 3 00H

0地址单元中存放的

字节型

的数据是: 20H

0地址单元中存放的

字型

的数据是: 4E20H(字型是两个字节)

2地址单元中存放的

字型

的数据是: 0012H(注意00是高八位,12是低八位)



DS和[address]

DS与CS类似,同样也是一个段寄存器,功能是存放需要读取的数据的端寄存器。

我们知道内存地址由段地址和偏移地址构成,例如我们需要读取10000H的内容,就需要段地址1000H和偏移地址0来进行访问

mov bx,1000H
mov ds,bx
mov al,[0]

第三行中的[0]就代表偏移地址,那么段地址呢?其实默认他会取ds寄存器中的数据作为段地址,因此我们在读取内存中的数据的时候就需要提前设定好段地址放在DS中。

那么为什么要分两步将地址存放到DS中呢,因为8086CPU不支持

将数据直接送入到DS中

,但是可以将另一个寄存器的内容转移到DS中,因此我们可以从bx进行中转数据。

样例:将al中的数据送入内存单元10000H中。

mov bx,1000H
mov ds,bx 		#将bx作为中转的寄存器
mov [0], al



字的传送

由上文中我们可以知道,一个字的组成是由两个字节组成的,内存单元中一个单位就是一个字节。

样例:已知内存情况如下,请说明执行结束后的ax, bx, cx的值

​ 10000H 23

​ 10001H 11

​ 10002H 22

​ 10003H 66

  • mov ax, 1000H ->此时ax中的值为1000H

  • mov ds, ax ->将ax中的数据转移到ds中,此时ds为1000H

  • mov ax,[0] ->将内存中的1000:0开始的内容填充到ax寄存器中 值为

    ax=1123H

  • mov bx,[2] ->同上,将内存中1000:2开头的内容填充到bx中 值为

    bx=6622H

  • add cx,[1] ->同上,

    cx=2211H



mov add sub 指令

在基本的类型中注意不能的类型

  • 不能实现mov 内存单元,内存单元

  • 不能实现add ds,ax

  • 不能实现mov 段寄存器,数据

样例:请写指令,累加数据段(123B)的前三个

字型数据

mov ax,123BH
mov ds,ax		//将内存段ds设置为ax中存储的内容123B
mov ax,0
add ax,[0]
add ax,[2]
add ax,[4]

总结

  • 字在内存中进行存储的时候用两个

    连续的内存单元

    来进行存放,低位放在低位,高位放在高位
  • 【address】表示偏移地址为address的内存单元,此时段地址取ds中的数据
  • mov, add, sub是具有两个操作对象的指令,jmp是具有一个操作对象的指令
  • 当将数据进行相加如果超出了范围,那么超过的范围的字段直接舍弃掉



栈(FILO)

在CPU中的栈机制:

  • push ax 表示将寄存器ax中的数据送入到栈中(将数据送到栈内)
  • pop ax 表示将从栈顶取出来的数据送入到ax中(将栈顶的数据拿出来)
  • 8086CPU的入栈和出栈操作的基本单位都是


  • 由于基本单位是字,所以一定要注意高位和低位的区别

Q:我们怎么确定那一段是栈呢?我们在push和pop的时候,怎么确定栈顶呢?

A: 其实如同CS:IP代表下一次需要执行的内存的位置,栈也有SS和SP来进行表示栈的位置,其中

在任意


时刻,SS:SP指向栈顶的元素

因此push和pop命令执行之后,栈顶元素会发生改变。


push:

  1. SP=SP-2 SP指向当前栈顶元素的单元
  2. 入栈时候,栈顶元素由高地址方向朝着低地址方向增长

例题:如果将10000H~1000FH作为栈,初始栈的状态是空的,SS = 1000H,那么SP=?

谨记一点,SS:SP一直是指向栈顶元素,那么这个栈的栈底是1000F,而栈是空的,不存在栈顶元素,那么只能指向栈底元素的下一个单元了,SS:SP = 10010

因此SP=10H


pop

原理就是跟push向反,得到的栈顶元素会填充到你的目标寄存器中

问题1:将10000H~1000FH作为栈,初始栈的状态是空的,将AX,BX,DS中的数据入栈

mov ax,1000
mov ss,ax
mov sp,0010H		#栈的空间到1000F 但是栈顶元素应该是这个单位加上1(因为初始栈为空)
push ax
push bx
push dx

例题2:将10000H~1000FH这段空间看做是栈,初始状态为空

设置Ax = 001AH , BX = 001BH

利用栈,交换AX与BX中的数据

mov ax,1000H
mov ss,ax
mov sp,0010H
mov ax,001AH
mov bx,001BH

push ax
push bx			//此时栈顶到栈底分别为bx ax
pop ax			//将栈顶字 bx放置到ax中
pop bx			//将栈顶字 ax放置到bx中

总结cs、ss、ds

  • CS:IP 代码段
  • SS:SP 栈段
  • DS:IP 数据段



实验二:用机器指令和汇编指令编程

在这里插入图片描述

在这里插入图片描述



版权声明:本文为qq_52245648原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。