IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【汇编语言】笔记 -> 正文阅读

[嵌入式]【汇编语言】笔记

目录

寄存器

数据在寄存器中的存储

8086的CPU是16位结构,其CPU内部总线的宽度是16,这意味着CPU内部的寄存器、运算器、控制器一次能传输、存储的最大数据为16位。

对于通用寄存器来说,例如ax,可以分为高位ah和低位al,各自占用8位bit,是ax的一半。在使用命令操作ah、al时,单独的将其看作是8bit的寄存器,al的溢出不会影响ah。

8086CPU如何给出物理地址

8086CPU的外部地址总线宽度为20,而CPU内部一次只能处理16位bit,内存寻址需要20位bit,这中间差了4位bit。

8086CPU内部通过加法器运算两次16位bit数据,即段地址 * 16 + 偏移地址得出物理地址。二进制数据乘16意味着左移4位bit,这样就可以凑出20位bit数据。

偏移地址受限于16位bit,最大为2^16=64KB。

CS和IP

CS是段寄存器,IP是指令指针寄存器。CPU从内存中获取要执行的指令,指令地址=CS * 16 + IP。

8086CPU的执行指令的过程:
1、从CS:IP指向的内存地址读取指令进入指令缓冲器
2、IP寄存器的值自动增加,指向下一条指令
3、执行指令(转至第1步,循环执行)

jmp

同时修改CS和IP寄存器的内容:jmp 段地址:偏移地址,jmp 2AE3:3

只修改IP寄存器内容:jmp 某一寄存器,jmp ax

寄存器(内存访问)

数据在内存单元的存储

8086PC机中一个字(16bit)代表两个字节,CPU是16位的,一次处理的数据宽度是16位,因此在寄存器与内存交互过程中,每次处理字大小(16bit)的数据。

8086的一个内存单元有8bit,两个连续内存单元称为字单元。字单元包括高地址和低地址的内存单元,当字单元数据进入寄存器,高地址内存单元存于寄存器高地址,低地址内存单元存于寄存器低地址。

DS和[address]

寄存器访问内存单元中的数据,需要有准确的地址指向。DS段寄存器中存放要访问内存单元的段地址,偏移地址通过[address]来控制,[0]表示偏移指针指向段的0号单元,[1]表示指向段的1号内存单元。

DS是段寄存器,只能通过寄存器赋值,不能直接赋值。

mov ax,1000H
mov ds,ax        ; 给ds寄存器赋值
mov bh,[0]       ; 将10000H的内存单元数据读入bh
mov [2],bx       ; 将bx寄存器16位bit写入10002H地址的字单元

CPU的栈机制

CPU提供push和pop指令,来将一段连续内存模拟成栈,SS段寄存器记录栈的段地址,SP寄存器用作偏移指针,指向栈顶。

8086CPU的栈段是一段连续内存,地址由低到高。入栈时,数据优先存入高地址,SP从高地址往低地址偏移,出栈时,SP从低地址往高地址偏移。栈的溢出需要自行控制,8086CPU不提供这样的保护机制。

push过程:
1、SP=SP-2
2、将数据写入SS:SP地址的字单元

pop过程:
1、将SS:SP地址的内存数据读出
2、SP=SP+2

SS作为段寄存器,只能通过寄存器赋值。

mov ax,1000H
mov ss,ax
mov sp,0000H      ; 定义从10000H~1FFFFH的栈段
mov ax,2000H
mov ds,ax         ; 定义要访问的数据段起始位置20000H
push bx            ; 将bx中的数据入栈
pop ax             ; 出栈数据存入ax
push [0]           ; 将20000H处字单元数据入栈
pop [2]            ; 出栈的字单元数据存入20002H地址字单元

内存段

一组连续内存单元,可以抽象定义成“段”,这组内存单元的起始地址称为段地址,想要访问其中某个内存单元需要一个偏移指针。段地址存于段寄存器,偏移指针可存于普通的寄存器中。

(作为段寄存器,赋值只能通过通用寄存器中转,不能像其他寄存器直接赋值。)

当这组内存单元被不同的寄存器指向,便有了不同的虚拟意义。比如当它被CS:IP指向时,这意味着这段内存存放代码指令,就可以称之为“代码段”。

当被DS指向时,可以称之为“数据段”,当被SS:SP指向时,可以称之为“栈段”。连续的内存本身只用作存储,CPU为其赋予了不同的存储意义,它用作什么,主要看寄存器中的设置。

程序的生命周期

编写

用汇编语言编写的程序文件称为“源程序”,在“源程序”中分为“伪指令”和“程序”两个部分,例如:

Go

assume cs:codesg            ; 声明代码段

codesg segment              ; 代码段开始

	mov ax,0123h
	mov bx,0456h
	add ax,bx
	add ax,ax
	
	mov ax,4c00h        ; 这两行,标识程序结束执行,交出CPU控制权
	int 21h

codesg ends                 ; 代码段结束

end                         ; 标识编译结束位置

真正被编译为01机器码的只有中间汇编语言的部分,其余部分用来指示编译器工作,算是一种“伪指令”。

编译

编译器(masm)将“源程序”文件编译为“xxx.obj”文件。

连接

连接器(overlay linker)将“xxx.obj”文件连接为“xxx.exe”可执行文件。连接器起到的效果是,组合多个目标文件,或是组合程序调用的其他库文件中的子程序,并将目标文件最终处理为可执行文件。

加载

exe可执行文件需要被调入内存才能被CPU执行,“调入操作”需要当前正在运行的程序执行。并在成功调度后,让出CPU控制权给编写的程序,程序执行后再将CPU控制权让回。

当程序被调入内存,CPU会将CS:IP指向程序所在位置,进而执行汇编代码。

程序在内存中的位置由操作系统决定,其分配两块空间(1)256字节的数据区,称为程序段前缀PSP,用于DOS和被加载程序通信(2)被加载的程序

假设PSP区域起始地址为SA:0,那么被加载程序的起始地址为SA+10H:0。

SA:256 = SA * 16 + 16 * 16 = (SA + 16) * 16 = SA+10H:0

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:55:12  更:2022-05-01 15:56:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 1:34:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码