| |
|
开发:
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位bit,最大为2^16=64KB。 CS和IPCS是段寄存器,IP是指令指针寄存器。CPU从内存中获取要执行的指令,指令地址=CS * 16 + IP。 8086CPU的执行指令的过程: 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过程: pop过程: 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。
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/26 2:51:25- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |