汇编网首页登录博客注册
whitewindy的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
友情链接

[2019-09-04 16:06] 1-4章笔记

每一种CPU都有自己的汇编指令集
汇编语言由以下组成
汇编指令
伪指令
其他符号

微型机存储器的存储单元可以存储一个字节

指令和数据是应用上的概念,在内存或磁盘上,指令和数据没有区别。CPU在工作时,把有些信息看作指令,有些看作数据。

CPU进行数据读写,必须和外部器件进行3类信息交互
-存储单元的地址(地址信息)
-器件,读OR写命令(控制信息)
-数据(数据信息)

每一个CPU芯片都有许多管脚,这些管脚和总线相连。

内存地址空间:一个CPU的地址总线宽度为10那么可以寻址1024个内存单元,这1014个地址单元就是内存地址空间。是逻辑存储器,将主板上的各类存储器都当内存来看待。

主板:CPU,存储器,外围芯片组,扩展插槽(一般插有RAM内存条和各类接口卡)等

插在扩展插槽上的接口卡:直接控制外部设备,显示器音箱打印机等。扩展插槽通过总线和CPU相连。
各类存储器芯片:RAM(随机存储器,可读可写,带电存储,关机即失):存放CPU使用的绝大部分                  数据程序,主随机存储器一般由{装在主板上RAM}和{扩展插槽上RAM}组成
                  ROM(只读存储器,不丢失):装有基本输入输出系统的ROM:可以通过BIOS利用相应设备进行基本输入输出。主板上的ROM中存储着系统BIOS,显卡上的ROM存储显卡BIOS,网卡存储网卡BIOS
                  接口卡上的RAM:比如显存。显示卡随时将显存中的数据输出到显示器。

主板上有CPU,通过总线连接RAM(主存储器),ROM(装有系统BIOS),扩展插槽RAM内存条(主存储器),扩展插槽显卡(RAM显存+ROM装有显卡BIOS),扩展插槽网卡(ROM装有网卡BIOS)和其他器件
所有RAM和ROM的存储空间被CPU看作内存地址空间,它的容量受CPU寻址能力的限制
因此,基于一个计算机硬件系统编程时应先知道这个系统中的内存地址空间分配情况,当要在某类存储器中读写数据时,要先知道它的首尾单元地址。

一个典型的CPU由运算器控制器寄存器等构成,由内部总线相连。
不同的CPU,寄存器个数结构不同。8086有14个寄存器:
AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW
它们都是16位的,可以放两个字节。而内存地址空间的一个单元是8位1个字节。
其中AX,BX,CX,DX是通用寄存器,存放一般数据。_X可以分为_H和_L分别表示高8位低8位
(8086上一代的CPU寄存器都是8位)
16位结构:寄存器16位+寄存器与运算器间通路16位+运算器可一次处理16位数据
即内部一次性处理传输暂时存储的地址为16位

一个字==两个字节

汇编指令和寄存器名称不区分大小写

所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元都有唯一的地址,称为物理地址。CPU访问内存单元时,需要向地址总线发出物理地址。不同的CPU有不同形成物理地址的方式。8086:物理地址=段地址*16+偏移地址;计算由地址加法器完成,然后内部总线将结果送入输入输出控制电路,输入输出控制电路将物理地址送上地址总线
因为CPU地址总线有20位,而内部一次性处理传输暂时存储的地址只有16位。为了充分表现寻址能力,则通过两个16位地址合成一个20位物理地址,再通过地址总线传送
算法含义:CPU在访问内存时用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址
段的划分来自CPU,一个段的最大长度为64KB(因为偏移地址16位)
CPU可以用不同的段地址和偏移地址形成物理地址

段寄存器:CS,DS,SS,ES 提供段地址,送入地址加法器合成物理地址
IP是指令指针寄存器 CS是代码段寄存器 CPU将CS:IP指向内容看作指令
CS:IP指示CPU当前要读取指令的地址,读取一条指令后,IP的值自动增加X,以使CPU读取下一条指令

通过改变寄存器控制CPU的指令:
MOV AX,123   传送指令,不能用于CS:IP
MOV AL,[0]     自动取DS中的数据为内存单元的段地址,0为偏移地址,将DS:0放入AL
MOV BX,1000H 
MOV DS,BX     取DS方式,因为8086不能直接将数据放入段寄存器
MOV AX,[0]     传送16位数据     
JMP 2AE3:3    JMP指令,用于CS:IP,CS=2AE3,IP=0003 CPU从CS:IP处读取指令
JMP AX          修改IP值为AX中值
转移指令

执行一次JMP指令改变两次IP
指令送入指令缓冲器后IP即改变一次,指令从指令缓冲器送入执行器执行后再按照JMP改变IP的要求再改变一次
Debug 实模式程序的调试工具
查看CPU各寄存器的内容,内存情况,在机器码级跟踪程序运行
启动:
mount d d:\dos\masm
d:
debug
q 退出debug
开始:
R 查看,改变CPU寄存器的内容
RIP 查看,改变CPU寄存器的IP
RCS 查看,改变CPU寄存器的CS

D 0000:0000 查看内存中的内容(不写内存地址则默认CS:IP)
E 0000:0000 改写内存中的内容    
-D 0000:0000 F 查看内存中的内容(以上范围)
-E 0000:0000 按下回车可提问方式改写内存内容
-E 0000:0000 'A' ''A+B'' 改写内存中的内容可为字符/字符串

U 0000:0000 将内存中的机器指令翻译成汇编指令
T                  执行一条机器指令(默认CS:IP)
A 0000:0000 回车,向内存写入汇编指令


字单元:2给存储单元 低地址存放低位字节
DS存放要访问数据的段地址

将一段内存当作数据段,得以用DS存放数据段的段地址,再用相关指令访问

以栈的方式访问内存空间,将数据从内存存取入寄存器:
PUSH AX
POP AX      以字为单位
SS 数据段地址寄存器  SP 寄存器存放偏移地址
任意时刻SS:SP指向栈顶元素 PUSH将寄存器的内容放入栈顶上方,POP将栈顶元素取出至寄存器
CPU无法保证栈顶超界问题
-PUSH []
-POP []        也可在内存单元与内存单元之间传送数据,将SS:SP指向栈中内存单元与DS:[]指向内存单元进行数据传送

汇编语言源程序:
汇编指令  
伪指令(无机器码,不被CPU执行):由编译器执行,编译器根据伪指令进行相关编译工作
标号(eg:codesg作为段名会被编译连接程序处理为一个段的段地址)指代一个地址
伪指令:
codesg segment
codesg ends         成对使用,表示一个段的开始和结束,codesg是段名(程序可被编译必用)
一个汇编程序由多个段组成
end 汇编程序结束标记
assume 某一段寄存器和程序中用segment···ends定义的段关联:assume cs:codesg
源程序:汇编语言写的包含汇编指令和伪指令
程序:源程序中最终由计算机执行处理的指令或数据
源程序文件-----编译-----》目标文件-----连接---------》可执行文件(二进制文件)
可执行文件:程序和数据+相关的描述信息(程序大小,占用内存)
OS依照.exe文件中的描述信息,加载机器码和数据入内存,并进行相关初始化(eg:设置CS:IP指向第一条要执行的指令),然后由CPU执行程序
运行可执行文件中的程序P2:正在运行的程序P1,将P2从可执行文件加载入内存,将CPU的控制权交给P2,P2运行,P1暂停运行。P2运行完毕,将CPU的控制权交给P1(程序返回)
程序返回:必须有,若无则是逻辑错误
MOV AX,4C00H
INT   21H
程序返回是汇编指令,由CPU执行
编译时发生的错误是语法错误,运行时发生的是逻辑错误

编辑:edit
编译:MASM
提供源文件(.asm) 得到目标文件(.obj)【列表文件(NUL.lst)交叉引用文件(NUL.crf)  】中间结果可忽略
连接:link
提供目标文件(.obj)得到可执行文件(.exe)映像文件(NUL.MAP)
库文件(.lib可能需要提供,如果程序调用某库文件子程序,需连接库文件和目标文件)
DOS下简洁的编译链接过程:(以FIST为例)
MASM FIST;(注意分号,这样会忽略中间文件)(在当前目录下可省略目录只写文件名)
LINK FIST;   (相同后缀省略后缀)
运行直接在DOS下输文件名

用户通过操作DOS中的shell程序:command.com(命令解释器)来操作DOS工作
DOS启动后,先完成其他重要的初始化工作,然后运行command.com,command.com运行后,执行完其他相关任务后,在屏幕显示出由当前盘符和当前路径组成的提示符,等待用户输入。
输入FIST试图执行FIST.EXE时,正在运行的command.com将EXE中的程序加载入内存,设置CPU的CS:IP指向程序的第一条指令(程序的入口),command.com暂停运行,EXE运行,运行结束后返回到command.com,CPU继续运行command.com,command.com再次在屏幕显示出由当前盘符和当前路径组成的提示符,等待用户输入。
汇编程序从写出到执行:
EDIT---ASM--->MASM----OBJ--->LINK----EXE---->COMMAND---内存中的程序--->CPU

用debug对程序的执行过程进行跟踪分析来发现隐藏较深的错误(debug可以将程序加载入内存,设置CS:IP指向程序入口,但不放弃对CPU的控制):可单步执行程序,查看每条执行的执行结果
程序结束返回到debug中,q退出debug返回到command中
command加载debug,debug加载EXE,EXE返回debug,debug返回command
进入DOS后debug fist.exe 
不考虑重定位,DOS中EXE的加载:空闲内存区(SA:0)PSP(SA:0)程序(SA+10H:0)
PSP:程序段前缀,DOS用PSP和被加载的程序进行通信,256字节
DOS一般将PSP和程序划分到不同段(物理地址连续段地址不同)
DS=SA,设置CS:IP指向程序入口指SA+10H:0(此前要初始化其他相关寄存器)
(最终是CS比DS大10)

int 21 用P命令执行
评论次数(0)  |  浏览次数(410)  |  类型(默认类型) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码