寒假汇编笔记

p3: 基础知识3

总线:连接cpu和其他部件的导线

在逻辑上划分为地址总线,逻辑总线,数据总线
cpu对存储器进行写入操作时,要怎么判断这个二进制代码是地址还是数据还是控制信号呢?
看通过什么总线写入内存即可

p5:基础知识5

主板和接口

每一台pc机中都有一个主板,主板上有一些核心器件和主要器件
cpu不能直接控制计算机中的设备,比如显示屏,打印机,直接控制这些设备的是插在扩展插槽上面的接口卡

p6寄存器(cpu的工作原理1)

8086cpu中:

总线的类型

cpu的内部总线,链接控制器,运算器以及其他cpu内部的器件
外部总线:连接cpu和主板上的其他设备的总线

寄存器

1.通用寄存器
AX,BX,CX,DX,通常用来存放一般性数据
为了兼容低位(8位)的寄存器,所以将AX分为了两个8位的寄存器:AH和AL,即可以用AL来存8位的数据,当al中有进位时,寄存器会将这个值抛弃掉,但不是真正的丢弃了(后面再讲)

字在寄存器中的存储

切忌默认一个字等于两个字节
在十六位的系统中:一个字等于两个字节
32位系统中:一个字等于四个字节
64位系统中,一个字等于8个字节

2.3几条汇编指令

汇编指令不区分大小写
练习:使用四条指令编写求出24

2.4物理地址

cpu再访问内存单元时一定要向内存提供一个物理地址
在这里插入图片描述

==8086cpu(16位)==给出物理地址的方法
cpu中提供两个16位地址,一个是段地址,一个是偏移地址,两个地址通过内部总线传送给一个地址加法器,将两个16位地址转换为一个20位地址(段地址*16+偏移地址

2.8段的概念

错误认识:cpu被分成了一个一个的段,每个段有自己的段地址
正确认知:内存并没有分段,由于物理地址的组成,所以我们可以用分段的方式来管理内存:
比如如果我们有需要时,我们可以将连续的内存单元看作一个段,用段地址*16作为初始地址,再用偏移地址作为内存单元

注意:

偏移地址为16位,所以寻址能力位216,所以一个段长度最大为216(64k)

小节:

1.cpu可以使用不同的段地址和偏移地址来形成同一个物理地址
2.给定段地址为1000H,则用偏移地址来寻址最多可以定位多少个内存单元?
64k
即1000H~1FFFFH
练习
在这里插入图片描述
下面写错了,最小为1001H
在这里插入图片描述

2.9段寄存器

就是提供段地址的
cs代码段地址寄存器
ds数据段
es附加栈段
ss堆栈

2.10cs和ip

cs:代码段寄存器
ip:指令指针寄存器
在任何时候,cpu将cs和ip中的地址当做段地址和偏移地址,用他们合成物理地址

修改cs和ip地址

同时修改cs和ip
在这里插入图片描述
单独修改ip
在这里插入图片描述

小结

cpu只将cs:ip指向的内容看做指令
8086cpu工作过程:
1.cpu根据cs:ip指向的内存单元读取指令,将读取出来的指令放入指令缓冲区
2.cs:ip执行完指令后会将ip自动加上本指令所占的长度,指向下一条指令
3.执行指令缓冲区的指令,然后重复步骤1

3.1内存中字的存储

任何两个连续的地址单元,可以看成一个连续的字单元:
eg:n号单元和n+1号单元,可以将其看作两个独立的地址单元,也可以看成是地址为n的字单元的高位地址和低位地址

mov指令可以完成的两种功能:

1.将数据放入一个寄存器
2.将一个寄存器中的值放入另一个寄存器
3.将一个内存单元中的数据送入另一个寄存器
比如下面的三条指令的功能就是,将段地址为1000H,偏移地址为0的地址中存储的数据放入al寄存器中(【 】括起来的地址就是偏移地址
如果将第三步反过来就是将寄存器中的值送入内存单元在这里插入图片描述

例题

在这里插入图片描述
注意:如果用ax来接受数据,默认接受16位(一个字)的数据(ax就是16位寄存器)
在这里插入图片描述
注意:段寄存器不可以在算数指令中
比如add ds ,ax

3.5数据段

顾名思义
不想打字了直接开摆
al:八位,所以是字节数据
如果是ax的话,就是字型数据,则每次偏移地址+=2
在这里插入图片描述
第三章总结:
在这里插入图片描述
在这里插入图片描述

3.6栈

ss和sp

ss:栈顶的段地址
sp:栈顶的偏移地址
任何时刻,ss:sp指向栈顶元素

当栈为空时

ss:sp指向的是栈中最高单元的下一个单元
在这里插入图片描述
举个例子
在这里插入图片描述

push和pop的用法

1.push/pop 段寄存器,将段寄存器中的数据入栈/将出栈的数据放入段寄存器中
2.push/pop 通用寄存器 ,同上
3.push/pop[0],将内存单元的数据入栈,后同上
注意:
先将sp-=2再存入数据
pop先将数据取出再+=2

4.1第一个程序

assume cs :codecs
//codecs被定义为一个段的名称,经过编译,链接处理为一个段的地址
	codesg segment
		start:
			{程序段}
			mov ax, 4c00H
			int 21H//这两段的意思就是实现程序的返回
		codesg ends//段结束
	end	//程序结束

bx和loop程序

loop s的用法

s是一个标号,标号代表了一个地址
当执行loop时:
1.cx-=1
2.判断cx是否大于0,如果大于0,跳转到s处执行s地址对应的指令,否则退出

eg:求212的值

assume cs:codesg

codesg segment 
		mov ax,2
		mov cx,11
 		s:add ax,ax
		loop s
		mov ax 4c00H
		int 21H
codesg ends 

end

debug和编码中的异同点

在编码过程中,不能直接用

mov ax ,【0】

来将ds:【0】中的数据传递给ax,必须先用

mov bx ,0

再用

mov ax 【bx】

loop综合应用

将ffff:6中的数据×3放入dx中

assume cs: codesg
codesg segment
	mov ax ,0ffffH//编译器不能识别以字母开头的数据所以要加零
	mov ds ,ax//段寄存器不能直接被立即数赋值
	mov bx ,6
	mov al ,[bx]
	mov ah,0
	mov dx,0//清零
	
	mov cx,3
s:ax=ax+ax
	loop s
	
	mov ax 4c00H
	int 21H

段前缀

比如

mov ax,ds:[bx]

其中bs就是段前缀,如果不加段前缀的话默认的段前缀就是ds
看到29了

包含多个段的程序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值