汇编
Kevin_K_H_ZHENG
知识是需要耐下性子慢慢打磨的
展开
-
8.7 div指令
例题1:利用除法指令计算100001/100因为100001大于65535,不能用ax寄存器存放,所以使用16位的除法程序执行后,(ax)=03E8H(即1000),(dx)=1(余数为1)例题2:利用除法指令计算1001/100被除数1001可用ax寄存器存放,除数100可用8位寄存器存放。所以采用8位的除法程序执行后,(al)=0Ah(即10), (ah)=1...原创 2020-01-04 01:13:37 · 792 阅读 · 0 评论 -
2.5 16位结构的CPU
16位结构描述了一个CPU具有以下几方面特征:运算器一次最多可以处理16位的数据 寄存器最大的宽度位16 寄存器与运算器之间的通路是16位的...原创 2019-07-07 11:02:52 · 716 阅读 · 0 评论 -
2.4 物理地址
CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。我们将这个唯一的逻辑的线性空间地址称为物理地址。...原创 2019-07-07 11:00:54 · 174 阅读 · 0 评论 -
2.3 几条汇编指令
汇编指令不区分大小写汇编指令举例AX寄存器只有16位,如果add后进位超过了16位能够表示的数字范围,在AX寄存器中将只保留16位中的数字。进位就这么毫无痕迹的舍弃了??C5H+93H=158H,超过AL表示范围,丢弃高位,位58H(CPU不是真的丢弃这个进位值)如果改为add ax,93H,那么结果就是158H检测点1. 写出每条汇编指令执行后相...原创 2019-07-07 10:58:08 · 676 阅读 · 0 评论 -
2.2 字在寄存器中的存储
一个字(word)可以存放在16位寄存器中,这个字的高位字节和低位字节自然就可以完全存放在8086的AX这种16位的寄存器中。1 word = 2 Byte = 16 bit高8位为AH,低8位为AL。对于一串AX中的数据,可以用不同的逻辑意义来看待它。...原创 2019-07-07 10:13:14 · 853 阅读 · 0 评论 -
2.1 通用寄存器
CPU概述CPU由计算器、控制器、寄存器组成8086CPU是所有x86CPU的祖宗寄存器概述8086CPU的寄存器AX BX CX DX SI DI SP BP IP CS SS DS ES PSW通用寄存器8086CPU所有的寄存器都是16位的,可以存放两个字节(一个字)。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数...原创 2019-07-07 10:05:17 · 276 阅读 · 0 评论 -
1.11 内存地址空间(概述)
接口卡计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制。CPU对外部设备都不能直接控制(显示器,打印机等)。直接控制这些设备进行工作的是插入在拓展插槽上的接口卡。CPU通过总线可以直接控制接口卡,从而事件CPU对外部设备的间接控制。各类存储器芯片一台PC包含在物理上独立的多个存储器芯片。按读写属性分类随机存储器(RAM) 只读存储器(ROM)按功能和连...原创 2019-07-07 09:49:42 · 558 阅读 · 0 评论 -
1.10 控制总线
CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。所以,控制总线的宽度就决定了CPU同时对多少种外部器件的控制能力。...原创 2019-07-07 01:24:04 · 526 阅读 · 0 评论 -
1.9 数据总线
CPU与内存或其他器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了CPU和外界的数据传送速度。传送89D88088CPU只有8根数据总线,一次只能传送1Byte。从低位字节开始传送。二进制从低位到高位排序,D8为110110008086CPU,是16位CPU,一次能够传送2Byte...原创 2019-07-07 01:19:34 · 887 阅读 · 0 评论 -
1.8 地址总线
CPU是通过地址总线来定位存储单元的。地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。(32位CPU与64位CPU区别就在于寻址能力)寻址能力一个CPU有N根地址总线,每条能传递的高低电平代表0和1两种情况,那么总共就能传送2^N个不同信息,定位到2^N个不同的内存单元(Byte)。64位CPU有64根地址总线。64位系统与64位CPU要达到完全的64位...原创 2019-07-07 01:09:09 · 919 阅读 · 0 评论 -
1.7 CPU对存储器(内存)的读写
存储单元的顺序编号,可以看作存储单元在存储器中的地址。CPU要从内存中读数据,首先要指定存储单元的地址。也就是说他要先确定他要读哪一个存储单元中的数据。CPU与外部器件进行信息交互的种类存储单元的地址(地址信息) 器件的选择,读或写的命令(控制信息) 读或写的数据(数据信息)总线总线就是计算机中专门用来连接CPU和其他芯片的导线。CPU通过总线将地址、数据和控...原创 2019-07-07 00:25:57 · 6322 阅读 · 0 评论 -
1.6 存储单元
存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号。一个存储单元能存储多少信息计算机的最小信息单位:bit,一个二进制位pc存储器的存储单元可以存储一个Byte,8 bits存储器的计量单位1KB=1024B=2^10B1MB=1024KB=2^10KB1GB=1024MB=2^10MB1TB=1024GB=2^10GB(硬盘厂商采用的计量单位为比例为1...原创 2019-07-06 23:52:33 · 450 阅读 · 0 评论 -
1.5 指令和数据
指令和数据是应用上的概念。在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。CPU在工作的时候把有的信息看做指令,有的信息看做数据,为同样的信息赋予了不同的意义。(C语言中变量的类型也是类似功能)...原创 2019-07-06 23:45:14 · 593 阅读 · 0 评论 -
1.4 存储器
CPU是计算机的核心部件,它控制整个计算机的运作并进行运算,要想让一个CPU工作,就必须向它提供指令和数据。指令和数据在存储器中存放,也就是平时所说的内存。一台PC中内存的作用仅次于CPU。离开了内存,性能再好的CPU也无法工作。磁盘不同于内存,磁盘上的数据或程序如果不读到内存中,就无法被CPU使用。...原创 2019-07-06 23:42:18 · 93 阅读 · 0 评论 -
1.3 汇编语言的组成
组成汇编指令(机器码的助记符) 伪指令(没有对应的机器码,由编译器执行,计算机并不执行) 其他符号(如+、-、*、/,由编译器识别)汇编语言的核心是汇编指令,它决定了汇编语言的特性。...原创 2019-07-06 23:36:13 · 1229 阅读 · 0 评论 -
2.6 8086CPU给出物理地址的方法
地址总线、数据总线、控制总线要分为内部和外部的。8086CPU的外部地址总线宽度为20,达到1MB的寻址能力。但是8086CPU的内部又只能处理16位,为了不浪费20的宽度。它采用了将两个16位地址合成一个20位物理地址的方法,即段地址+段偏移来合成。地址加法器采用物理地址=段地址*16+偏移地址的方法...原创 2019-07-08 23:11:45 · 358 阅读 · 0 评论 -
4.1 一个源程序从写出到执行的过程
过程编写->编译(MASM.exe)->链接(LINK.exe)->执行可执行文件中包含两部分内容程序(从原程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据) 相关的描述信息(比如:程序有多大、要占多少内存空间等)在操作系统中,执行可执行文件中的程序操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化...原创 2019-07-11 21:25:49 · 797 阅读 · 0 评论 -
7.10 不同的寻址方式的灵活应用
不同寻址方式的总结[idata]用一个常量来表示地址,可用于直接定位一个内存单元; [bx]用一个常量来表示内存地址,可用于间接定位一个内存单元; [bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元; [bx+si]用两个变量表示地址; [bx+si+idata]用两个变量和一个常量表示地址。问题7.6编程,将datasg...原创 2019-07-17 23:53:10 · 656 阅读 · 0 评论 -
7.9 [bx+si+idata]和[bx+di+idata]
定义[bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata(即bx中的数值加上si中的数值再加上idata)问题7.5用Debug查看内存,结果如下:2000:1000 BE 00 06 00 6A 22 ...写出下面的程序执行后,ax、bx、cx中的内容mov ax,2000hmov ds,axmov bx,1000hmov s...原创 2019-07-17 22:44:41 · 311 阅读 · 0 评论 -
7.8 [bx+si]和[bx+di]
在前面,我们用[bx(si或id)]和[bx(si或di)+idata]的方式来指明一个内存单元,我们还可以用更为灵活地方式:[bx+si]和[bx+di][bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)(即bx中的数值加上si中的数值)问题7.4用debug查看内存,结果如下:2000:1000 BE 00 06 00 00 00 ...写出下面程...原创 2019-07-17 00:03:24 · 1795 阅读 · 0 评论 -
7.7 SI和DI
定义si与di是8086CPU中和bx功能相近的寄存器,它们不能够分成两个8位寄存器来使用。既生瑜何生亮si(source?)与di(destination?)在某些场景下一个可以代表数据源,一个代表目的地,更为语义化也比bx方便,不过代码量可能变多。问题7.2用si和di实现将字符串‘welcome to my blog’赋值到它的后面的数据区中。源程序assume...原创 2019-07-16 22:47:48 · 687 阅读 · 0 评论 -
7.6 用[bx+idata]的方式进行数组的处理
本节你将学到用[bx+idata]的方式进行数组的处理[bx+idata]的组合犹如数组的下标,特别适合用来操作数组类型的数据。这种方式为高级语言实现数组提供了便利机制例题7.4 与或运算解决大小写转换问题的例题我们使用了2个loop,不免对性能有些影响,在这里我们对例题进行改造assume cs:code,ds:datadata segment db 'lInUX...原创 2019-07-16 22:27:15 · 255 阅读 · 0 评论 -
7.5 [bx+idata]
定义[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata)问题7.1用Debug查看内存,结果如下2000:1000 BE 00 06 00 00 00 ....写出下面的程序执行后,ax、bx、cx中的内容。mov ax,2000Hmov ds,axmov bx,1000Hmov ax,[bx]mov cx,...原创 2019-07-16 22:15:20 · 517 阅读 · 0 评论 -
7.4 与或运算解决大小写转换问题
本节你将学到如何使用and和or指令进行大小写转换将‘lInUX’转换为大写,‘KeVInZhENg’转换为小写在ASCII码中,大小写的编码总是间隔了32,在二进制中刚好表现在第6位,如00100000与00000000就相差了32。assume cs:code,ds:datadata segment db 'lInUX' db 'KeVInZhENg'...原创 2019-07-16 21:47:34 · 402 阅读 · 0 评论 -
7.3 以字符形式给出的数据
在汇编程序中,以‘XXXX’(可以有多个字符)这样形式指出数据是以字符的形式给出的,编译器会将它们转化为相应的ASCII码。源程序assume cs:code,ds:datadata segment db 'lInUX' db 'KeVIn'data endscode segmentstart: mov ax,'a' mov bx,'b' ...原创 2019-07-16 21:20:19 · 226 阅读 · 0 评论 -
7.2 关于ASCII码
只要编码和解码采用相同的规则,我们就可以将人可以理解的信息存入计算机,再从计算机中取出。ASCII编码方案:编码方案是一套规则,约定了用什么样的信息来表现现实对象。在ASCII中,用61H来表示“a”,62H表示“b”。文本编辑时键盘敲入a键,在屏幕上输出“a”的过程按下键盘a键,这个按键的信息就会被送入计算机,计算机用ASCII码的规则对其进行编码,将其转化为61H存储在...原创 2019-07-16 20:29:39 · 610 阅读 · 0 评论 -
2.10 CS和IP
CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。CS为代码段寄存器 IP为指令指针寄存器(段偏移)8086机中,任意时刻,CPU将CS:IP指向的内容当做指令执行。这也就回答了为什么在内存中,指令和数据没有任何区别,都是二进制数据,但是CPU在工作的时候却能把一部分信息看做指令的原因。CS与IP工作示意图为什么存储器能...原创 2019-07-08 23:12:07 · 760 阅读 · 0 评论 -
2.9 段寄存器
8086CPU在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。段寄存器就是提供段地址的8086CPU有4个段寄存器:CS(代码地址)、DS(数据地址)、SS(堆栈地址)、ES(什么地址都有,前面三个不够放就放这)当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。...原创 2019-07-08 23:12:00 · 167 阅读 · 0 评论 -
2.8 段的概念
段的概念内存并没有分段,段的划分来自于CPU,由于8086CPU用“基础地址(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以使用分段的方式来管理内存。段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数。可以根据需要,降低至连续、起始地址为16倍数的一组内存单元定义为一个段。偏移地址为16位,16位地址的寻址能力位64KB,所...原创 2019-07-08 23:11:53 · 206 阅读 · 0 评论 -
4.2 源程序
汇编源程序1. 伪指令汇编中的指令:汇编指令 伪指令汇编指令:有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。伪指令:没有对应的机器指令,最终不被CPU所执行。是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。常见伪指令1. XXX segment 。。。 XXX endssegment与ends成对出...原创 2019-07-13 09:19:06 · 383 阅读 · 0 评论 -
1.2 汇编语言的产生
由来由于机器语言难以辨别和记忆,难以排错的缺点,产生了汇编语言汇编语言的主题是汇编指令汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。汇编指令的本质汇编指令是机器指令的助记符,一一对应。汇编指令与机器指令的对比机器指令:1000100111011000操作:寄存器BX的内容送到AX中汇编指令:MOV AX,BX(从寄存器B...原创 2019-07-06 23:29:11 · 684 阅读 · 0 评论 -
1.1 机器语言
机器语言是机器指令的集合。不同的微处理器,由于硬件设计和内部结构的不同,就需要不同的电平脉冲来控制,使它工作。所以每一种微处理器都有自己的机器指令集,也就是机器语言。机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。机器语言的缺点书写和阅读机器码程序很难,并且不易查错,都是由10组成的。...原创 2019-07-06 23:14:22 · 882 阅读 · 0 评论 -
5.2 Loop指令
loop指令的格式:loop 标号CPU执行loop指令的时候,要进行两步操作1. (cx)=(cx)-1;2. 判断cx中的值,不为零则转至标号处执行程序,如果为0则向下执行程序5.1assume cs:codecode segmentstart: mov ax,2 mov cx,11s: add ax,ax loop s ...原创 2019-07-13 16:12:15 · 434 阅读 · 0 评论 -
5.1 [BX]
[bx]的功能mov ax,[bx]功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中即:(ax) = ((ds)*16+(bx))mov [bx],ax功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA处即:((ds)*16+(bx)) = (ax)错误示例debug...原创 2019-07-13 15:37:15 · 232 阅读 · 0 评论 -
3.4 mov、add、sub指令
mov指令的操作形式mov 寄存器,数据 比如:mov ax,8mov 寄存器,寄存器 比如:mov ax,bxmov 寄存器,内存单元 比如:mov ax,[0]mov 内存单元,寄存器 比如:mov [0],axmov 段寄存器,寄存器 比如:mov ds,axmov 寄存器,段寄存器 比如:mov ax,dsmov ...原创 2019-07-09 20:22:55 · 3210 阅读 · 2 评论 -
4.9 使用debug跟踪exe程序执行过程
Dos在运行一个程序的时候,是由command将程序从可执行文件中加载入内存,并使其得以执行。这个过程我们无法追条指令地看到程序的执行过程,因为command的程序加载,设置CS:IP指向程序的入口的操作是连续完成的,而当CS:IP一指向程序的入口,command就放弃了CPU的控制权,CPU立即开始运行程序,直至程序结束如果解决这样的矛盾,debug!Debug可以将程序加载...原创 2019-07-13 12:05:59 · 5448 阅读 · 0 评论 -
4.7~4.8 谁将可执行文件中的程序装在进入内存并使它运行
执行1.exe程序发现它执行完后立即返回,没有任何输出。由于我们的程序只是在寄存器中进行了简单的加法操作,没有操作显存,所以不会显示任何东西。执行流程分析1. 如果在DOS中执行1.exe时,是正在运行的command.com(我们这里是DOSBox),将1.exe中的程序加载入内存2. command设置CPU的CS:IP指向程序的第一条指令(即程序的入口,即下方s...原创 2019-07-13 10:36:38 · 341 阅读 · 0 评论 -
4.5 使用masm连接目标文件
上节我们通过masm.exe生成了.obj文件。这节我们将教授如何使obj文件连接成exe文件步骤1. 在DOSBox装载的文件夹中已经包含了link.exe程序,用于连接2. 执行linkObject Modules:需要连接的目标文件名Run File:生成的exe文件名List File:映射文件的名称,这个文件是连接程序将目标文件链接为可执行文件过程中...原创 2019-07-13 10:17:56 · 857 阅读 · 0 评论 -
4.3~4.4 使用masm编译汇编程序
本文教授如何教asm文件编译为obj文件步骤1. 保存下面程序,文件名为1.asmassume cs:abcabc segment mov ax,2 add ax,ax add ax,ax mov ax,4c00H int 21Habc endsend2. 将1.asm与masm程序相关文件放在一块3. 运行masm...原创 2019-07-13 09:53:28 · 1294 阅读 · 0 评论 -
3.10 栈段
定义在8086这种16位结构的CPU中,我们可以将长度为N(N<=64KB,因为段偏移最多只能从0x0000~0xFFFF变化,表示64*1024中变化)的一组连续、起始地址位16的倍数的内存单元认为安排为一个段,同样我们也可以人为安排这个段为栈段。比如,我们将10010H~1001FH这段长度为16字节的内存空间当做栈来用,以栈的方式来访问。这段空间就可以称为一个栈段,段地址为10...原创 2019-07-12 22:39:16 · 926 阅读 · 0 评论