汇编语言应该是我们如今学的最“低级”的语言了,由于如今不会再有人去学机器语言了。
而汇编语言还在一些硬件或者嵌入式设备上使用并开发着。
下面资料是为了大学的汇编考试整理的资料,如今与大家分享,希望能给大家提供帮助。
计算机主要由运算器、控制器、存储器和输入输出设备五大部件构成。
字长代表了CPU对数据处理的能力和精度。
OS的主要部分是常驻监督程序Monitor,仅仅要一开机就存在于内存中,能够从用户接收命令,并使OS运行对应的动作。
汇编语言和机器语言一一相应。
汇编程序就是用来把由用户编制的汇编程序翻译成机器语言程序的一种系统程序。
高级语言的翻译程序有两种:
一种是先把高级语言程序翻译成机器语言,(或先翻译成汇编语言,然后又汇编程序再次翻译成机器语言)然后才干在机器上运行。——编译程序
直接把高级语言程序在机器上执行,一边解释一边执行。
翻译程序包含汇编程序、解释程序、编译程序。
ALU :算术逻辑运算单元:用来进行算术和逻辑运算及其对应操作。
8086 CPU内部结构按功能分为:
8086对存储器和IO设备的全部操作都是由BIU完毕的。
8086CPU的20位地址线可直接寻址1M存储器物理空间。但CPU内部寄存器均为16位的寄存器,16位寄存器怎样实现20位地址寻址呢?
CPU是将有关寄存器内容左移4位,然后由专门地址加法器,与16位偏移地址相加。形成20位的物理地址。以便找到存储单元。
IP 用来存放下一条要运行指令在代码中的偏移地址。
IP的内容由BIU自己主动改动。使它总是指向下一条要取的指令在现行代码段中的偏移地址。
因为BIU和EU是各自独立并行工作的。在EU运行指令的同一时候,BIU可预取以下一条或几条指令。
Flags:反映CPU运算中的状态特征和存放某些控制标志。
8086CPU的外部数据总线和内部数据总线都是16位的,是真正的16位机。
寄存器能够分为程序可见寄存器和程序不可见寄存器。
程序可见寄存器是指在汇编语言程序设计中用到的寄存器。能够由指令来指定。
程序不可见寄存器指一般程序设计中不用而由系统所用的寄存器。
程序可见寄存器能够分为通用寄存器、专用寄存器和段寄存器。
AX/BX/CX/DX是数据寄存器。用来临时存放计算过程中用到的操作数,结果或其它信息。能够以字(16位),或字节(8位)形式訪问。都是通用寄存器。但又有各自专用的功能。
AX: Accumulator。做累加器用。是算术运算的主要寄存器。
BX: Base,做通用寄存器使。在计算存储器地址时,经常使用作基址寄存器。
CX:Count,作为通用寄存器使用。经常使用来保存计数值。如在移位指令、循环和串处理指令中作隐含的计数器。
DX:Data:可做通用寄存器使用,在做双字长运算时把DX和AX组合在一起存放一个双字长数。DX存放高位字。
SP/BP/SI/DI四个16位寄存器能够像数据寄存器一样在运算中存放操作数。但仅仅能以字(16位)为单位使用。
一般用在存储器寻址时,提供偏移地址。
在程序执行中,始终指向下一条指令的首地址。与CS连用确定下一条指令的物理地址。
一个存储单元中存放的信息称为该存储单元的内容。
在存储单元里以字节为单位存储信息。
假设机器字长为8位时,则地址为0004H单元中存放的信息为78H。也就是说,该单元的内容为78H。(0004H)=78H
一个字存入存储器要占有连续的两个字节单元。存放时低位字节存入低地址,高位字节存入高地址。这样两个字节单元就构成了一个字单元。
双字单元的存放方式与字单元类似,他被存放在相继的4个字节中,低位字存入低地址区,高位字存入高地址区。
双字单元的地址有其最低字节的地址指定。
同一个地址既能够作为字节单元的地址,又可看做字单元,双字单元或四字单元的地址。
假设用X表示某存储单元的地址,则X单元的内容能够表示为(X);假如X单元中存放着Y,而Y又是一个地址,则可用(Y)=((X))表示Y单元的内容。
在1M的存储器里,每个存储单元都有一个唯一的20位地址,称为该存储单元的物理地址。
偏移地址指在段内相对于段起始地址的偏移值。
把段地址左移四位再加上偏移地址就形成物理地址。
物理地址=段地址*16D+偏移地址
物理地址=段地址*10H+偏移地址
专门存放段地址的寄存器。称为段寄存器。
每一个段寄存器能够确定一个段的起始地址。
ES作段寄存器,BX作间接寄存器寻址的单元送入AX寄存器。
ES作段寄存器,SI作间址寄存器的寻址单元内容送入BX寄存器。
DS作段寄存器,BP作间址寄存器寻址的单元内容送入EAX寄存器。
一个计算机的指令集合。就是该计算机的指令系统。
每条指令有两部分组成,操作码字段和地址码字段。
操作码字段:说明该指令所要完毕的操作,即该条指令的性质。
地址码字段:描写叙述该指令的操作对象。
一般地址码字段通常是直接给出操作数;或者给出操作数存放的寄存器编号;或者给出操作数存放的存储单元的地址或有关的地址的信息。
依据地址码字段所给出的地址的个数,指令格式可分为零地址、一地址、二地址、三地址、多地址指令。
指令中用于确定操作数存放地址的方法,称为寻址方式。
假设地址码字段直接给出了操作数。这样的寻址方式是马上寻址。
假设地址码字段指出了操作数所在的寄存器编号,叫寄存器寻址。
假设操作数存放在存储器中。则地址码字段通过各种方式给出了存储器地址。叫存储器寻址。
寻找和获得操作数或操作数存放地址或指令转移地址的方法称为寻址方式。
操作数及操作结果存放的地址有三处:存放在指令的地址码字段中。存放在寄存器中;存放在存储器的数据段(DS)、堆栈段(SS)或附加数据段(ES)中。
其相应有三种操作数:马上操作数、寄存器操作数、存储器操作数
要寻找这些操作数就有三种基本寻址方式:马上寻址方式、寄存器寻址方式、存储器寻址方式。
马上寻址方式寻找的操作数紧跟在指令操作码之后。
格式:操作码 数字表达式
“267”是数字。“B AND 0FEH”是数字表达式,PORT1是一个符号名。属于常数。DATA1是定义的段名。就是段地址,属于常数。
汇编马上寻址方式时,汇编程序首先计算数字表达式的值,然后写入指令的地址码字段,称为马上数。
寄存器寻址是指要寻找的操作数在某个寄存器中。
格式:操作码 寄存器名
汇编程序将寄存器的地址编号写入指令的地址码字段,当机器运行含有这样的寻址方式的指令时,依据地址码字段的编号訪问到寄存器。继而訪问到操作数。
存储器寻址方式:当操作数放在存储器中的某个单元时,CPU要訪问存储器才干获得该操作数。假设存储器的存储单元是20位,通过各种方法算出段内偏移地址(有效地址)。结合段地址形成20位物理地址,找到操作数,称为存储器寻址。
直接寻址方式是指要寻找的操作数的地址在指令中直接给出。
操作码 [地址表达式]
操作码 [数字表达式]
如:如果TABLE是在数据段定义的一个字节数组的首地址标号,偏移地址为1000H
若同意在汇编指令中指定除DS寄存器以外的段寄存器作为操作数的段地址。这就是段超越。
段寄存器名:地址表达式
段寄存器名:[地址表达式]
段寄存器名:数字表达式
段寄存器名:[数字表达式]
设TABLE是在附加数据段定义的一个字节数组的首地址标号,其偏移地址为1000H。则
表示将字节数组的第一个数组元素送入AL寄存器中。
寄存器间接寻址方式:通常将BX,BP称为基址寄存器,SI,DI称为变址寄存器,寻址时操作数的地址被放在这些寄存器中。
操作码 [基址寄存器名或变址寄存器名]
也同意指定段超越前缀来取得其它段中的数据:
操作数的偏移地址是指定寄存器的值与一个整数之和。
操作码 变量名[机制寄存器名或变址寄存器名]
操作码 [变量名+基址寄存器名或变址寄存器名]
操作码 符号名[机制寄存器名或变址寄存器名]
操作码 [符号名+基址寄存器名或变址寄存器名]
操作码 机制寄存器名或变址寄存器名+/-数字表达式
基址变址寻址方式:操作数的偏移地址是两个指定寄存器的值之和。
操作码 [基址寄存器名][变址寄存器名]
操作码 [基址寄存器名+变址寄存器名]
当机器运行含有这样的寻址方式的指令时,根据地址码字段的值得到基址寄存器和变址寄存器的值,将其相加。和作为操作数的偏移地址。
能够用段超越前缀又一次指定段寄存器:
操作码 变量名[基址寄存器名][变址寄存器名]
操作码 变量名[基址寄存器名+变址寄存器名]
操作码 [变量名+基址寄存器名+变址寄存器名]
符号名 变量名[基址寄存器名][变址寄存器名]
符号名 变量名[基址寄存器名+变址寄存器名]
符号名 [变量名+基址寄存器名+变址寄存器名]
操作码 [基址寄存器名+变址寄存器名+/-数字表达式]
四类传送指令:通用传送指令、累加器专用传送指令、地址传送指令、标志传送指令
把CPU内部的寄存器细分为段寄存器和寄存器。
堆栈中数据的压入弹出必须以字为单位进行。
将标志寄存器内容压入堆栈
将16位堆栈数据弹入标志寄存器中。
XCHG指令可实现字互换和字节互换。
互换能够在寄存器之间进行。也能够在寄存器和存储单元之间进行。
互换源、目的两个操作数的存放位置。
XCHG指令源、目的操作数的寻址方式不同意是马上寻址方式,两个存储单元之间不能直接互换数据。
地址传送指令:将地址送到指定的寄存器中
LEA:偏移地址送寄存器
LDS:指针送指定寄存器和DS
LES:指针送指定寄存器和ES
操作:(REG)?SRC的偏移地址
功能:把源操作数的偏移地址送到指定的寄存器
LDS:指针送指定寄存器和DS寄存器
LES:指针送指定寄存器和ES寄存器指令
ADD和ADC指令两个操作数不能同一时候为存储器寻址方式,而且目的操作数不能为马上数寻址方式。
SBB 带借位减法指令
功能:完毕带借位的源操作数和目的操作数的减法运算,并把运算结果保存在目的操作数中。
CF表示机器的最高有效位向更高有效位的进位。
两个16位数相乘。结果为32位数。
有符号数乘法指令IMUL
在乘法指令中。被乘数也即目的操作数隐含在AX(字运算)或AL(字节运算)中,乘数也即源操作数。
两个8位数相乘是16位,存放在AX中。
本指令的功能用于使某个操作数中的若干位维持不变,而使另外若干位位0的操作。也称屏蔽某些位。
要维持不变的位必须和1相与,而要置零的位必须和0相与。
123.屏蔽AL中的高四位
指令运行前后。AL无变化。但运行后使标志位发生了变化,即CF=0,OF=0.
本指令用于使某个操作数中的若干位维持不变,使另外若干位置1的场合。要维持不变的必须和0相或,而置为1的位必须和1相或。
指令运行前后,(AL)不变,但运行后标志位发生了变化,即CF=0。OF=0.
用于推断两个数是否相等;也可用于操作数中的若干位维持不变,而使另外若干位取反的操作。维持不变的位与0相异或,取反的位与1相异或。
131.使AL中最高位和最低位取反。其它位保持不变
用于不改变原有操作数的情况下,用来检測某一位或某几位的条件是否满足。用于条件转移指令的先行指令。
不检測的那些位与0相与,即屏蔽掉。
检測的那些位与1相与,即保持不变。
133.检測(AL)的最高位是否为1,若为1则转移,否则顺序运行。
这样的寻址方式的汇编格式有三种:
指令名 SHORT 转移目标地址标号
指令名 转移目标地址标号
指令名 NEAR PTR 转移目标地址标号
指令中直接指明了要转移的目标地址。因此叫直接寻址。又由于这样的指令仅仅改变了IP寄存器的值而不改变CS寄存器的值,因此又叫段内寻址。
当运行这样的寻址方式的转移指令时。机器取出位移量,与当前IP相加。和送入IP寄存器中。CS寄存器内容保持不变,从而实现转移。
位移量不同,转移范围不同。当位移量位8位,仅仅同意转移到与本条指令的下一条指令相距-128~127范围内的存储单元中。当位移量位16位时。同意转移到当前代码段内不论什么地方。
137.位移量能够是一个带符号的8位数,也能够是一个带符号的16位数。表示了转移地址偏移本条指令的下一条指令的字节数。负数表明要向当前指令的后面跳转。整数要向当前指令的前面跳转。
142.两个无符号数比較大小时,机器依据CF标志位来推断大小。即两无符号数相减。若不够减,则最高位有借位,CF=1;否则CF=0。
当CF=1时,说明被减数低于减数。
当CF=0且ZF=0时,说明被减数高于减数;
当CF=0且ZF=1时。说明被减数等于减数。
144.比較两个数,相等则转移,否则顺序运行
指令仅仅改变IP寄存器的值而不改变CS寄存器的值。因此又叫段内寻址。
转移的目标地址放在存储器中。称作间接寻址。
又由于指令不仅改变IP寄存器的值并且改变CS寄存器的值,因此又叫段间寻址。
150.控制转移指令通过改变CS。IP来控制程序的指令流程。
操作:IP?(当前IP)+8位偏移量
转移范围:转到本条指令的下一条指令的-128~127个字节范围内。
(1)格式:JMP 16位寄存器名
功能:无条件转移到当前段的指定偏移地址处
(2)格式:JMP 存储器寻址方式
(2)格式:JMP 段地址值:偏移地址
155.全部JMP指令都不影响状态标志位。
(3)段内带马上数返回
(4)段间带马上数返回
操作:推断測试条件,若条件成立,则IP?(IP)+8;若条件不成立,则IP保持不变。
159.从寄存器里取数据比从存储器里取数据快得多从而提高了指令运行速度。
162.注意寄存器间接寻址和相对寻址的差别
163.寄存器相对寻址:操作数的偏移地址是指定寄存器的值与一个整数之和。
166.基址变址寻址:操作数的偏移地址是两个指定寄存器的值之和。
[基址寄存器名][变址寄存器名]
[基址寄存器名+变址寄存器名]
167.相对基址变址寻址
168.两个段寄存器之间不同意直接传送数据。
注意:入栈时。SP-2
175.完毕两个字节数据相加
176.伪指令语句也叫指示性语句。仅仅是用来指示、引导汇编程序在汇编过程中做一些操作。为汇编程序在翻译时提供有关信息,并不翻译机器代码的语句。
177.一条宏指令语句的功能相当于若干条指令语句的功能。
187.一条语句能够写在多行上,续行符是&
189.EQU伪操作中的表达式是不同意反复定义的。而=伪操作同意反复定义。
191.操作数“?”能够保留存储空间。但不存入数据。待到程序执行时存放中间或终于结果。
193.实现两个32位数的乘法程序
194.将一个字节压缩BCD码转化成两个ASCII码
195.利用直接查表法完毕将键盘输入的一位十进制数(0~9)转换成相应的平方值,并存放在SQRBUF中。
196.从键盘输入一个小写字母,将其转化成大写字母在屏幕上显示出来。
197.在内存中有一个字节单元NUM,存有带符号数据,要求计算绝对值,放入RESULT单元中。
198.多分支结构实现方法:条件选择法,跳跃表法,地址表法
200.SHL:将操作数逻辑左移指定次数
201.除法指令要求被除数的长度必须是除数的两倍。
在除法中,被除数也即目的操作数隐含在AX(字节运算)或DX-AX(字运算)中,除数即源操作数。
AX能够分别訪问高位字节AH和低位字节AL。
AX,BX,CX,DX能够以字(16位)形式訪问,也能够以字节(8位)訪问。都是通用寄存器。
207.使用ASSUME伪操作来明白段和段寄存器的关系。
当中段寄存器名必须是CS,DS,ES,SS,而段名必须是由SEGMENT定义的段中的段名。
208.ASSUME伪操作仅仅是指定某个段分配给哪一个段寄存器,并不能把段地址装入段寄存器。
数据段和堆栈段须要这样做。CS不须要这样做,这是在程序初始化时完毕的。
209.从CISC体系结构转变为RISC体系结构后。在相同的工艺水平(即相同的主频,相同的工艺尺寸,相同的芯片面积下),使CPU的速度和性能有了非常大的提高。
211.操作码:指明要完毕操作的性质
213.汇编语言依赖于某一详细计算机。是面向机器的语言。
(1)“0”有两种表示法
(2)8位二进制反码所能表示的范围-128~127
(3)当一个带符号数由反码表示时,最高位为符号位。当符号位为0时,后面的7位为数值部分;当符号位为1时。一定要按位取反。才干得到数值。
220.压缩BCD码是用一个字节来表示两个十进制数(0~9)。每半个字节保存一个0~9的数字。
221.结果的显示或打印。可使用DOS功能调用02号功能来实现。是把要显示字符的ASCII码送入DL寄存器,功能调用02号送入AH寄存器,通过指令INT 21H就可以实现结果的显示与打印。
’原先放在何处并不重要。但一定是要送入DL寄存器才干显示。
将在缓冲区中的字符串送屏幕显示或打印。
225.IP是指向下一次要取出的指令。与CS寄存器配合才干形成真正的物理地址。
若IF=0,则屏蔽上述的中断请求。
若DF=1。则引起串操作指令为自己主动减量指令,也就是从高地址到低地址处理字符串。
若DF=0,则引起串操作指令为自己主动增量指令,也就是从低地址到高地址处理字符串。
237.1个字节8位。1个字16位,1个双字32位。
241.物理地址计算:
段基址和偏移量一般用十六进制数表示,简便的计算方法是在段基址的最低位补以0H。再加上偏移量。
242.某内存单元的地址用十六进制数表示为,则物理地址是:
244.每一个存储单元在存储器中所具有的地址称为存储单元的物理地址。段基地址是每一段的起始地址,单元与段基地址的距离称为段内偏移地址。也叫偏移量。
247.寄存器寻址操作数直接存放在寄存器中,由指令指定的寄存器进行寻址,即操作数包括在指令规定的8位。16位,或32位寄存器中。
三条指令操作数分别存于8位DL。16位AX和32位ECX中。
250.默认情况下,觉得操作数有效地址的作用域是DS所指向的数据段,但同意使用段超越前缀指定为其它段,即对于寻找操作数来说。还同意操作数在以代码段、堆栈段或附加段为基准的区域中,仅仅要在指令中指明是段超越的。
251.寄存器间接寻址能够是16位或32位的
254.若是以寄存器BP间接寻址,则操作数在堆栈段中。SS左移4位后与BP相加作为操作数的地址。
“ES”和“DS”各自是两指令的段超越前缀。
258.若在指令中规定是段超越的,则BP也能够与其它的段寄存器相加。形成操作数地址。如:
位移量表示数组起始地址偏移量,基址表示能够变化的数组元素下标。
274.汇编语言对指令的大写和小写是不敏感的。
276.OFFSET AREA1 是指地址单元AREA1在段内的地址偏移量。寻找内存操作数时,必须以段地址(在某个段寄存器中)加上此单元的段内地址偏移量,才干确定某一内存单元的物理地址。
281.LEA指令能够用对应的源操作数为马上数的MOV指令取代。
段寄存器由指令操作码LDS、LES、LSS分别指定为DS,ES,SS.通用寄存器由目的操作数reg指定。
(2)该指令无显式操作数,操作数是隐含的。指令默认段的数据段DS,而偏移量总是从寄存器EBX中得到。
(3)指令运行前AL是下标。运行后AL是查表的结果。若要在其它段中查表,可加段前缀。
285.通过查表转换指令,求0~9中随意一个数的平方
运行后:(AL)=25
286.实现存储器操作数与马上数相加/减,与累加器或别的寄存器相加/减。和/差放到该存储单元中。
287.指令SBB [DI],100 实现的功能是用DS:[DI]所指单元的内容减去100再减去CF,结果送到DS:[DI]指向的字节单元中。
说明:JG为推断带符号数的大小。若大,则转移到后面的标号。
MUL:实现两个无符号数相乘,AL。AX或EAX的内容和OPRD的内容是两个无符号数,且假设OPRD长度为8位。则与AL内容相乘。相乘结果送到AX中。
299.某个操作数,自己和自己相“与”,操作数不变,能够使CF=0.
301.在实地址方式下,段寄存器的内容左移4位而得到段基地址。
304.依据程序的实际情况,SS,DS,ES也能够没有,仅仅有CS是不可缺少的。每一个程序至少必须有一个。
305.每一个源程序在其代码段中都必须有返回到DOS的指令语句。以保证程序运行完后能自己主动返回DOS,可继续向计算机键入命令。
306.作为存储器操作数的标号和变量有三种共同属性:
(1)段值:段基址,可用SEG运算符求得。
(2)偏移值:段内偏移地址。可用OFFSET运算符求得。
307.“?”表示不确定值。仅仅表示预留规定长度的存储空间。
310.操作数是字符串时,内存中存放的是每一个字符的ASCII码
311.复制操作符DUP,表示操作数反复若干次。
指出了段与段寄存器的关系。
319.三个数相加把结果放在SUM单元中。
323.宏调用展开在编译处。在EXE文件里有N份。
326.在汇编中字符就和字符串一样。是同一个概念,都用单引號。字符就是长度为1的字符串。
第一个AND是指令,在运行时起作用。
第二个AND是运算符。在编译时起作用。
第二个“+”是一个表达式,编译时处理。
334.$表示当前地址
335.汇编上机过程:
336.汇编程序的主要功能:
$+6必须是还有一条指令的首地址。
$用在伪操作的參数字段时,表示的是地址计数器的当前值。
347.ORG伪操作:用来设置当前地址计数器的值。
如常数表达式的值为N。则ORG伪操作能够使下一个字节的地址成为常数表达式的值N。
353下列传送指令中有语法错误的是(A)
354.逻辑移位指令SHR用于:D
J寄存器AX的值是(C)
358.简述汇编语言的上机过程:
259.运行段内返回RET指令时,运行的操作是:
260.运行段间返回RET指令时,运行的操作是:
261.其中断发生时。由中断机构自己主动完毕哪些动作?(中断过程)
265.串反复前缀指令
266.在串操作指令前使用反复前缀指令REPE,终止串的反复操作条件是(C)
267.以下指令中,合理而有意义的指令是(D)
MOVS是串传送指令,MOVSB传送一个字节
268.以下的数据传送指令中。错误的操作是(D)
马上数不能直接送段寄存器,即段寄存器仅仅能通过寄存器或存储单元传送数据。
269.运行下列指令后,正确的结果是(B)
适用于測试某一次运算的结果并依据不同的结果做不同的处理。
(4)JNS ;条件SF=0时转移。结果为正则转移。
271.測试BL寄存器内容是否与4FH相等。若相等则转NEXT处运行。代码为(B)
273.PSW寄存器共同拥有6位条件状态位,3位控制状态位。
276.注意NEG是求补,而不是求反。
277.假定(DX)=B。(CL)=3。(CF)=1。试确定下列各条指令单独运行后DX中的值。
RCR:带进位循环右移指令
RCL:带进位循环左移指令
该程序段已占有的存储字节数是多少?
注意:EQU定义的符号名不占存储空间。
ORG是设置该程序段的偏移地址。
282.循环控制指令測试条件
283.循环控制指令LOOPNZ/LOOPNE控制循环继续运行的条件是(B)
284.压缩BCD码指每一个字节存储两个BCD码
285.使计算机运行某种操作的命令是(B)
286.将数据5618H存放在存储单元中的伪指令是(B)
288.如TABLE为数据段中0100单元的符号名,当中存放的内容为0FF00H,下面两条指令有什么差别?AX寄存器的内容各自是什么?
289.对于以下的数据定义,三条MOV指令分别汇编成什么?
。也没有存储器相对寻址!!。
291.无符号数比較时,用“高于”或“低于”来做推断根据。
有符号数比較时,用“大于”或“小于”来做推断根据。
转移指令中,大部分指令能够用两种不同的助记符来表示。
比方。一个数低于还有一个数和一个数不高于也不等于还有一个数是等同的。
即JB和JNAE是等同的。
292.比較两个无符号数的大小
294.变量TABLE中存放了一个偏移地址。当无符号数X小于、等于或大于此偏移地址时,应去运行三个不同的程序段。
295.比較两个有符号数
有符号数比較条件转移指令
296.试分析以下程序段的功能是什么?
推断AL的内容,若为‘A’~‘Z’的大写字母时,程序段 LETTER处理,否则转OTHER处理。
297.计算机中为便于存储及计算机的物理实现,採用(A)。
299.机器指令是在程序执行期间由计算机来执行的。
300.伪指令在程序(B)阶段被处理。
301.在程序的開始能够用NAME或TITLE作为模块的名字。
但NAME和TITLE伪指令不是必要的。
302.一个完整、独立的汇编语言源程序能够没有(C)伪指令。
306.从微处理器的角度来看,计算机结构可分为CPU、内存、和IO子系统三个主要部分。
309.汇编语言程序的最后一条指令是汇编结束伪指令。
310.能够改动其值的定义符号常量的伪指令是等号(=)伪指令。
311.MOV AX,@DATA 中AX的值是由操作系统在程序执行之前传过来的。
313.在8086中。一个逻辑段最长为64K字节。
320.操作系统1号功能调用(输入一个字符)
321.已知在内存中有一个字节单元NUM,存有带符号数据,要求计算它的绝对值后,放入RESULT单元中。
322.编写计算以下函数值的程序:
323.程序:把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示。
324.程序:在ADDR单元中存放着数Y的地址,编一程序把Y中1的个数存入COUNT单元中。
能够依据最高有效位是否为1来计数。然后用移位的方法把各位数逐次移到最高位去。
327.偏移量=偏移地址=有效地址=段内地址
329.过程定义伪指令
336.H计算机刚一启动时,物理地址是多少?
339.实模式就是一般模式。就是我们经常使用的模式。
341.8086微处理器由哪几部分组成?
功能:完毕IOport对累加器的数据输入。
操作:(IO地址表达式)?AL
功能:完毕累加器对IOport的数据输出。
348.输入字符代码:
349.试编制一程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符。如不是,则退出程序。如是。则開始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存放)。直到接收到第二个空格符时退出程序。
分析:这一程序要求接收的字符从空格符開始又以空格符结束,因此程序中必须区分所接收的字符是否是第一个字符。所以。设立作为标志的存储单元FLAG。
一開始将其置为0。接收第一个字符后可将其置1.
351.调用程序和子程序在同一代码段中
352.调用程序和子程序不在同一个代码段中
354.子程序作主程序
366.在微处理器中,PUSH和POP指令在堆栈与寄存器或存储单元之间传送数据时,一次总是传送2个字节。
370.子程序作主程序。必须用FAR
372.期中考试2个编程。
使用该指令前,先在数据段建立一个表格,表格首地址存入BX寄存器中,欲代替码的表内位移量存入AL寄存器。
376.下列指令中哪条是正确的(D)
A错:马上数不能直接送段寄存器。即段寄存器仅仅能通过寄存器或存储单元传送。
B错:源操作数都是变址寄存器。
C错:普通寄存器不能向变址寄存器传数据。
377.使8086/88的标志寄存器F中的中断标志I置为关中断的命令是CLI。
379.SUB AX,[BX]目的操作数的寻址方式是寄存器直接寻址,源操作数採用的寻址方式是寄存器间接寻址。
381. 8088微处理器段内直接寻址64KB字节空间。若寻址1MB字节空间必须通过段寄存器管理实现。
382.设(SS)=2000H。(SP)=0486H,若在堆栈中取出3个数据。则栈顶的物理地址为2048CH。假设又在堆栈中存入3个数据,则栈顶的物理地址是20486H。
注意:堆栈中数据的压入弹出必须以字节为单位,所以PUSH和POP指令仅仅能作字操作。
383.中断系统的中断矢量表用来存放中断类型号,共预留了1KB个字节空间。
387.已知AL=3,分析下列程序段:
388.绘图说明下列语句所分配的存储空间及初始化的数据值。
391.操作数?能够保留存储空间。但不存入数据。
394.依据伪指令代码写内存情况是难点和必考点。
应该再次复习。尤其搞懂关于字符串的存放问题,DB和DW是不一样的,应再次学习。
395.BP、SP可称为指针寄存器
396.一般在作双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位字。
398.段寄存器也是一种专用寄存器。专用于存储器寻址,用来直接或间接的存放地址。段寄存器的长度为16位。
399.在存储器里以字节为单位存储信息。
地址从0開始编号,顺序的每次加1,因此存储器的物理地址空间是线性增长的,在机器里,地址是用二进制表示的,是无符号整数。书写格式使用十六进制数形式。
401.地址编号的范围用十六进制数表示为0000H~FFFFH。
402.存储器特性:内容是能够重复读取的。仅仅有当存入新的信息后。原来的内容就自己主动被覆盖了。
403.仅仅能在实模式下工作,仅仅需了解实模式。
404.80X86存储器在实模式下同意的最大寻址空间为1MB。由于地址总线宽度为20位。
405.每一个段的大小可达64KB。由于地址寄存器是16位的,这样段内地址可用16位表示。
406.在1MB的存储器里,每个存储单元都有一个唯一的20位地址。称为该存储单元的物理地址。
407.CS存放当前正在执行的程序;
DS存放当前执行程序的数据;
SS定义了堆栈所在区域。
408.段寄存器和偏移地址的默认组合
409.寻址方式分为:数据寻址和指令寻址
在微型计算机中,带符号的二进制数都採用补码表示。所以此处的操作数是补码,所以求 –操作数 就是求补操作。
419.有符号数比較大小:机器依据SF标志位来推断大小。即若被减数小于减数,差值为负,则SF=1;否则SF=0。前提是无溢出 OF=0.
421.名字的定义规则:
422.汇编字符串用单引號。如:‘ABC’
逻辑运算符的功能在汇编阶段完毕,逻辑运算指令的功能在运行时完毕。
第一个AND是逻辑运算指令,第二个AND是逻辑运算符
425.在汇编阶段处理:伪指令、宏指令、运算符
428.某系列微机对存储器分段。假设每个段最多的字存储单元(16位二进制)是32K。那么表示段内字节单元偏移地址的二进制位数应是(B)
431.MOV指令中目的操作数不能为马上数和CS。
434.运行下列指令后,AX寄存器中的内容是什么?
435.指令的操作数中,同意出现表达式,比如BUF1与BUF2均为变量名,以下指令中语法正确的是(D)
436.在的马上数寻址方式中,对寄存器的使用下列说法正确的是(D)
437.在DEBUG中,为查看或改动内存单元的内容。使用的命令是(A)
E命令:将内容写入内存
438.对CS段寄存器赋段地址的方法是(B)
(2)段间带马上数返回
440.8086CPU中,一个段最大可定义的字节数是(C)
441.软中断指令INT 21H运行,若AH=9时则完毕的功能是显示字符串。
444.编写指令将附加段中的一个字节变量COUNT送给AL寄存器。
446.最后移位指令吐血总结:
RCL:带进位的循环左移,每一位先加上CF的值,然后循环左移到最低位。原来的CF移到最低位;
汇编语言应该是我们如今学的最“低级”的语言了,由于如今不会再有人去学机器语言了。
而汇编语言还在一些硬件或者嵌入式设备上使用并开发着。
下面资料是为了大学的汇编考试整理的资料,如今与大家分享,希望能给大家提供帮助。
计算机主要由运算器、控制器、存储器和输入输出设备五大部件构成。
字长代表了CPU对数据处理的能力和精度。
OS的主要部分是常驻监督程序Monitor,仅仅要一开机就存在于内存中,能够从用户接收命令,并使OS运行对应的动作。
汇编语言和机器语言一一相应。
汇编程序就是用来把由用户编制的汇编程序翻译成机器语言程序的一种系统程序。
高级语言的翻译程序有两种:
一种是先把高级语言程序翻译成机器语言,(或先翻译成汇编语言,然后又汇编程序再次翻译成机器语言)然后才干在机器上运行。——编译程序
直接把高级语言程序在机器上执行,一边解释一边执行。
翻译程序包含汇编程序、解释程序、编译程序。
ALU :算术逻辑运算单元:用来进行算术和逻辑运算及其对应操作。
8086 CPU内部结构按功能分为:
8086对存储器和IO设备的全部操作都是由BIU完毕的。
8086CPU的20位地址线可直接寻址1M存储器物理空间。但CPU内部寄存器均为16位的寄存器,16位寄存器怎样实现20位地址寻址呢?
CPU是将有关寄存器内容左移4位,然后由专门地址加法器,与16位偏移地址相加。形成20位的物理地址。以便找到存储单元。
IP 用来存放下一条要运行指令在代码中的偏移地址。
IP的内容由BIU自己主动改动。使它总是指向下一条要取的指令在现行代码段中的偏移地址。
因为BIU和EU是各自独立并行工作的。在EU运行指令的同一时候,BIU可预取以下一条或几条指令。
Flags:反映CPU运算中的状态特征和存放某些控制标志。
8086CPU的外部数据总线和内部数据总线都是16位的,是真正的16位机。
寄存器能够分为程序可见寄存器和程序不可见寄存器。
程序可见寄存器是指在汇编语言程序设计中用到的寄存器。能够由指令来指定。
程序不可见寄存器指一般程序设计中不用而由系统所用的寄存器。
程序可见寄存器能够分为通用寄存器、专用寄存器和段寄存器。
AX/BX/CX/DX是数据寄存器。用来临时存放计算过程中用到的操作数,结果或其它信息。能够以字(16位),或字节(8位)形式訪问。都是通用寄存器。但又有各自专用的功能。
AX: Accumulator。做累加器用。是算术运算的主要寄存器。
BX: Base,做通用寄存器使。在计算存储器地址时,经常使用作基址寄存器。
CX:Count,作为通用寄存器使用。经常使用来保存计数值。如在移位指令、循环和串处理指令中作隐含的计数器。
DX:Data:可做通用寄存器使用,在做双字长运算时把DX和AX组合在一起存放一个双字长数。DX存放高位字。
SP/BP/SI/DI四个16位寄存器能够像数据寄存器一样在运算中存放操作数。但仅仅能以字(16位)为单位使用。
一般用在存储器寻址时,提供偏移地址。
在程序执行中,始终指向下一条指令的首地址。与CS连用确定下一条指令的物理地址。
一个存储单元中存放的信息称为该存储单元的内容。
在存储单元里以字节为单位存储信息。
假设机器字长为8位时,则地址为0004H单元中存放的信息为78H。也就是说,该单元的内容为78H。(0004H)=78H
一个字存入存储器要占有连续的两个字节单元。存放时低位字节存入低地址,高位字节存入高地址。这样两个字节单元就构成了一个字单元。
双字单元的存放方式与字单元类似,他被存放在相继的4个字节中,低位字存入低地址区,高位字存入高地址区。
双字单元的地址有其最低字节的地址指定。
同一个地址既能够作为字节单元的地址,又可看做字单元,双字单元或四字单元的地址。
假设用X表示某存储单元的地址,则X单元的内容能够表示为(X);假如X单元中存放着Y,而Y又是一个地址,则可用(Y)=((X))表示Y单元的内容。
在1M的存储器里,每个存储单元都有一个唯一的20位地址,称为该存储单元的物理地址。
偏移地址指在段内相对于段起始地址的偏移值。
把段地址左移四位再加上偏移地址就形成物理地址。
物理地址=段地址*16D+偏移地址
物理地址=段地址*10H+偏移地址
专门存放段地址的寄存器。称为段寄存器。
每一个段寄存器能够确定一个段的起始地址。
ES作段寄存器,BX作间接寄存器寻址的单元送入AX寄存器。
ES作段寄存器,SI作间址寄存器的寻址单元内容送入BX寄存器。
DS作段寄存器,BP作间址寄存器寻址的单元内容送入EAX寄存器。
一个计算机的指令集合。就是该计算机的指令系统。
每条指令有两部分组成,操作码字段和地址码字段。
操作码字段:说明该指令所要完毕的操作,即该条指令的性质。
地址码字段:描写叙述该指令的操作对象。
一般地址码字段通常是直接给出操作数;或者给出操作数存放的寄存器编号;或者给出操作数存放的存储单元的地址或有关的地址的信息。
依据地址码字段所给出的地址的个数,指令格式可分为零地址、一地址、二地址、三地址、多地址指令。
指令中用于确定操作数存放地址的方法,称为寻址方式。
假设地址码字段直接给出了操作数。这样的寻址方式是马上寻址。
假设地址码字段指出了操作数所在的寄存器编号,叫寄存器寻址。
假设操作数存放在存储器中。则地址码字段通过各种方式给出了存储器地址。叫存储器寻址。
寻找和获得操作数或操作数存放地址或指令转移地址的方法称为寻址方式。
操作数及操作结果存放的地址有三处:存放在指令的地址码字段中。存放在寄存器中;存放在存储器的数据段(DS)、堆栈段(SS)或附加数据段(ES)中。
其相应有三种操作数:马上操作数、寄存器操作数、存储器操作数
要寻找这些操作数就有三种基本寻址方式:马上寻址方式、寄存器寻址方式、存储器寻址方式。
马上寻址方式寻找的操作数紧跟在指令操作码之后。
格式:操作码 数字表达式
“267”是数字。“B AND 0FEH”是数字表达式,PORT1是一个符号名。属于常数。DATA1是定义的段名。就是段地址,属于常数。
汇编马上寻址方式时,汇编程序首先计算数字表达式的值,然后写入指令的地址码字段,称为马上数。
寄存器寻址是指要寻找的操作数在某个寄存器中。
格式:操作码 寄存器名
汇编程序将寄存器的地址编号写入指令的地址码字段,当机器运行含有这样的寻址方式的指令时,依据地址码字段的编号訪问到寄存器。继而訪问到操作数。
存储器寻址方式:当操作数放在存储器中的某个单元时,CPU要訪问存储器才干获得该操作数。假设存储器的存储单元是20位,通过各种方法算出段内偏移地址(有效地址)。结合段地址形成20位物理地址,找到操作数,称为存储器寻址。
直接寻址方式是指要寻找的操作数的地址在指令中直接给出。
操作码 [地址表达式]
操作码 [数字表达式]
如:如果TABLE是在数据段定义的一个字节数组的首地址标号,偏移地址为1000H
若同意在汇编指令中指定除DS寄存器以外的段寄存器作为操作数的段地址。这就是段超越。
段寄存器名:地址表达式
段寄存器名:[地址表达式]
段寄存器名:数字表达式
段寄存器名:[数字表达式]
设TABLE是在附加数据段定义的一个字节数组的首地址标号,其偏移地址为1000H。则
表示将字节数组的第一个数组元素送入AL寄存器中。
寄存器间接寻址方式:通常将BX,BP称为基址寄存器,SI,DI称为变址寄存器,寻址时操作数的地址被放在这些寄存器中。
操作码 [基址寄存器名或变址寄存器名]
也同意指定段超越前缀来取得其它段中的数据:
操作数的偏移地址是指定寄存器的值与一个整数之和。
操作码 变量名[机制寄存器名或变址寄存器名]
操作码 [变量名+基址寄存器名或变址寄存器名]
操作码 符号名[机制寄存器名或变址寄存器名]
操作码 [符号名+基址寄存器名或变址寄存器名]
操作码 机制寄存器名或变址寄存器名+/-数字表达式
基址变址寻址方式:操作数的偏移地址是两个指定寄存器的值之和。
操作码 [基址寄存器名][变址寄存器名]
操作码 [基址寄存器名+变址寄存器名]
当机器运行含有这样的寻址方式的指令时,根据地址码字段的值得到基址寄存器和变址寄存器的值,将其相加。和作为操作数的偏移地址。
能够用段超越前缀又一次指定段寄存器:
操作码 变量名[基址寄存器名][变址寄存器名]
操作码 变量名[基址寄存器名+变址寄存器名]
操作码 [变量名+基址寄存器名+变址寄存器名]
符号名 变量名[基址寄存器名][变址寄存器名]
符号名 变量名[基址寄存器名+变址寄存器名]
符号名 [变量名+基址寄存器名+变址寄存器名]
操作码 [基址寄存器名+变址寄存器名+/-数字表达式]
四类传送指令:通用传送指令、累加器专用传送指令、地址传送指令、标志传送指令
把CPU内部的寄存器细分为段寄存器和寄存器。
堆栈中数据的压入弹出必须以字为单位进行。
将标志寄存器内容压入堆栈
将16位堆栈数据弹入标志寄存器中。
XCHG指令可实现字互换和字节互换。
互换能够在寄存器之间进行。也能够在寄存器和存储单元之间进行。
互换源、目的两个操作数的存放位置。
XCHG指令源、目的操作数的寻址方式不同意是马上寻址方式,两个存储单元之间不能直接互换数据。
地址传送指令:将地址送到指定的寄存器中
LEA:偏移地址送寄存器
LDS:指针送指定寄存器和DS
LES:指针送指定寄存器和ES
操作:(REG)?SRC的偏移地址
功能:把源操作数的偏移地址送到指定的寄存器
LDS:指针送指定寄存器和DS寄存器
LES:指针送指定寄存器和ES寄存器指令
ADD和ADC指令两个操作数不能同一时候为存储器寻址方式,而且目的操作数不能为马上数寻址方式。
SBB 带借位减法指令
功能:完毕带借位的源操作数和目的操作数的减法运算,并把运算结果保存在目的操作数中。
CF表示机器的最高有效位向更高有效位的进位。
两个16位数相乘。结果为32位数。
有符号数乘法指令IMUL
在乘法指令中。被乘数也即目的操作数隐含在AX(字运算)或AL(字节运算)中,乘数也即源操作数。
两个8位数相乘是16位,存放在AX中。
本指令的功能用于使某个操作数中的若干位维持不变,而使另外若干位位0的操作。也称屏蔽某些位。
要维持不变的位必须和1相与,而要置零的位必须和0相与。
123.屏蔽AL中的高四位
指令运行前后。AL无变化。但运行后使标志位发生了变化,即CF=0,OF=0.
本指令用于使某个操作数中的若干位维持不变,使另外若干位置1的场合。要维持不变的必须和0相或,而置为1的位必须和1相或。
指令运行前后,(AL)不变,但运行后标志位发生了变化,即CF=0。OF=0.
用于推断两个数是否相等;也可用于操作数中的若干位维持不变,而使另外若干位取反的操作。维持不变的位与0相异或,取反的位与1相异或。
131.使AL中最高位和最低位取反。其它位保持不变
用于不改变原有操作数的情况下,用来检測某一位或某几位的条件是否满足。用于条件转移指令的先行指令。
不检測的那些位与0相与,即屏蔽掉。
检測的那些位与1相与,即保持不变。
133.检測(AL)的最高位是否为1,若为1则转移,否则顺序运行。
这样的寻址方式的汇编格式有三种:
指令名 SHORT 转移目标地址标号
指令名 转移目标地址标号
指令名 NEAR PTR 转移目标地址标号
指令中直接指明了要转移的目标地址。因此叫直接寻址。又由于这样的指令仅仅改变了IP寄存器的值而不改变CS寄存器的值,因此又叫段内寻址。
当运行这样的寻址方式的转移指令时。机器取出位移量,与当前IP相加。和送入IP寄存器中。CS寄存器内容保持不变,从而实现转移。
位移量不同,转移范围不同。当位移量位8位,仅仅同意转移到与本条指令的下一条指令相距-128~127范围内的存储单元中。当位移量位16位时。同意转移到当前代码段内不论什么地方。
137.位移量能够是一个带符号的8位数,也能够是一个带符号的16位数。表示了转移地址偏移本条指令的下一条指令的字节数。负数表明要向当前指令的后面跳转。整数要向当前指令的前面跳转。
142.两个无符号数比較大小时,机器依据CF标志位来推断大小。即两无符号数相减。若不够减,则最高位有借位,CF=1;否则CF=0。
当CF=1时,说明被减数低于减数。
当CF=0且ZF=0时,说明被减数高于减数;
当CF=0且ZF=1时。说明被减数等于减数。
144.比較两个数,相等则转移,否则顺序运行
指令仅仅改变IP寄存器的值而不改变CS寄存器的值。因此又叫段内寻址。
转移的目标地址放在存储器中。称作间接寻址。
又由于指令不仅改变IP寄存器的值并且改变CS寄存器的值,因此又叫段间寻址。
150.控制转移指令通过改变CS。IP来控制程序的指令流程。
操作:IP?(当前IP)+8位偏移量
转移范围:转到本条指令的下一条指令的-128~127个字节范围内。
(1)格式:JMP 16位寄存器名
功能:无条件转移到当前段的指定偏移地址处
(2)格式:JMP 存储器寻址方式
(2)格式:JMP 段地址值:偏移地址
155.全部JMP指令都不影响状态标志位。
(3)段内带马上数返回
(4)段间带马上数返回
操作:推断測试条件,若条件成立,则IP?(IP)+8;若条件不成立,则IP保持不变。
159.从寄存器里取数据比从存储器里取数据快得多从而提高了指令运行速度。
162.注意寄存器间接寻址和相对寻址的差别
163.寄存器相对寻址:操作数的偏移地址是指定寄存器的值与一个整数之和。
166.基址变址寻址:操作数的偏移地址是两个指定寄存器的值之和。
[基址寄存器名][变址寄存器名]
[基址寄存器名+变址寄存器名]
167.相对基址变址寻址
168.两个段寄存器之间不同意直接传送数据。
注意:入栈时。SP-2
175.完毕两个字节数据相加
176.伪指令语句也叫指示性语句。仅仅是用来指示、引导汇编程序在汇编过程中做一些操作。为汇编程序在翻译时提供有关信息,并不翻译机器代码的语句。
177.一条宏指令语句的功能相当于若干条指令语句的功能。
187.一条语句能够写在多行上,续行符是&
189.EQU伪操作中的表达式是不同意反复定义的。而=伪操作同意反复定义。
191.操作数“?”能够保留存储空间。但不存入数据。待到程序执行时存放中间或终于结果。
193.实现两个32位数的乘法程序
194.将一个字节压缩BCD码转化成两个ASCII码
195.利用直接查表法完毕将键盘输入的一位十进制数(0~9)转换成相应的平方值,并存放在SQRBUF中。
196.从键盘输入一个小写字母,将其转化成大写字母在屏幕上显示出来。
197.在内存中有一个字节单元NUM,存有带符号数据,要求计算绝对值,放入RESULT单元中。
198.多分支结构实现方法:条件选择法,跳跃表法,地址表法
200.SHL:将操作数逻辑左移指定次数
201.除法指令要求被除数的长度必须是除数的两倍。
在除法中,被除数也即目的操作数隐含在AX(字节运算)或DX-AX(字运算)中,除数即源操作数。
AX能够分别訪问高位字节AH和低位字节AL。
AX,BX,CX,DX能够以字(16位)形式訪问,也能够以字节(8位)訪问。都是通用寄存器。
207.使用ASSUME伪操作来明白段和段寄存器的关系。
当中段寄存器名必须是CS,DS,ES,SS,而段名必须是由SEGMENT定义的段中的段名。
208.ASSUME伪操作仅仅是指定某个段分配给哪一个段寄存器,并不能把段地址装入段寄存器。
数据段和堆栈段须要这样做。CS不须要这样做,这是在程序初始化时完毕的。
209.从CISC体系结构转变为RISC体系结构后。在相同的工艺水平(即相同的主频,相同的工艺尺寸,相同的芯片面积下),使CPU的速度和性能有了非常大的提高。
211.操作码:指明要完毕操作的性质
213.汇编语言依赖于某一详细计算机。是面向机器的语言。
(1)“0”有两种表示法
(2)8位二进制反码所能表示的范围-128~127
(3)当一个带符号数由反码表示时,最高位为符号位。当符号位为0时,后面的7位为数值部分;当符号位为1时。一定要按位取反。才干得到数值。
220.压缩BCD码是用一个字节来表示两个十进制数(0~9)。每半个字节保存一个0~9的数字。
221.结果的显示或打印。可使用DOS功能调用02号功能来实现。是把要显示字符的ASCII码送入DL寄存器,功能调用02号送入AH寄存器,通过指令INT 21H就可以实现结果的显示与打印。
’原先放在何处并不重要。但一定是要送入DL寄存器才干显示。
将在缓冲区中的字符串送屏幕显示或打印。
225.IP是指向下一次要取出的指令。与CS寄存器配合才干形成真正的物理地址。
若IF=0,则屏蔽上述的中断请求。
若DF=1。则引起串操作指令为自己主动减量指令,也就是从高地址到低地址处理字符串。
若DF=0,则引起串操作指令为自己主动增量指令,也就是从低地址到高地址处理字符串。
237.1个字节8位。1个字16位,1个双字32位。
241.物理地址计算:
段基址和偏移量一般用十六进制数表示,简便的计算方法是在段基址的最低位补以0H。再加上偏移量。
242.某内存单元的地址用十六进制数表示为,则物理地址是:
244.每一个存储单元在存储器中所具有的地址称为存储单元的物理地址。段基地址是每一段的起始地址,单元与段基地址的距离称为段内偏移地址。也叫偏移量。
247.寄存器寻址操作数直接存放在寄存器中,由指令指定的寄存器进行寻址,即操作数包括在指令规定的8位。16位,或32位寄存器中。
三条指令操作数分别存于8位DL。16位AX和32位ECX中。
250.默认情况下,觉得操作数有效地址的作用域是DS所指向的数据段,但同意使用段超越前缀指定为其它段,即对于寻找操作数来说。还同意操作数在以代码段、堆栈段或附加段为基准的区域中,仅仅要在指令中指明是段超越的。
251.寄存器间接寻址能够是16位或32位的
254.若是以寄存器BP间接寻址,则操作数在堆栈段中。SS左移4位后与BP相加作为操作数的地址。
“ES”和“DS”各自是两指令的段超越前缀。
258.若在指令中规定是段超越的,则BP也能够与其它的段寄存器相加。形成操作数地址。如:
位移量表示数组起始地址偏移量,基址表示能够变化的数组元素下标。
274.汇编语言对指令的大写和小写是不敏感的。
276.OFFSET AREA1 是指地址单元AREA1在段内的地址偏移量。寻找内存操作数时,必须以段地址(在某个段寄存器中)加上此单元的段内地址偏移量,才干确定某一内存单元的物理地址。
281.LEA指令能够用对应的源操作数为马上数的MOV指令取代。
段寄存器由指令操作码LDS、LES、LSS分别指定为DS,ES,SS.通用寄存器由目的操作数reg指定。
(2)该指令无显式操作数,操作数是隐含的。指令默认段的数据段DS,而偏移量总是从寄存器EBX中得到。
(3)指令运行前AL是下标。运行后AL是查表的结果。若要在其它段中查表,可加段前缀。
285.通过查表转换指令,求0~9中随意一个数的平方
运行后:(AL)=25
286.实现存储器操作数与马上数相加/减,与累加器或别的寄存器相加/减。和/差放到该存储单元中。
287.指令SBB [DI],100 实现的功能是用DS:[DI]所指单元的内容减去100再减去CF,结果送到DS:[DI]指向的字节单元中。
说明:JG为推断带符号数的大小。若大,则转移到后面的标号。
MUL:实现两个无符号数相乘,AL。AX或EAX的内容和OPRD的内容是两个无符号数,且假设OPRD长度为8位。则与AL内容相乘。相乘结果送到AX中。
299.某个操作数,自己和自己相“与”,操作数不变,能够使CF=0.
301.在实地址方式下,段寄存器的内容左移4位而得到段基地址。
304.依据程序的实际情况,SS,DS,ES也能够没有,仅仅有CS是不可缺少的。每一个程序至少必须有一个。
305.每一个源程序在其代码段中都必须有返回到DOS的指令语句。以保证程序运行完后能自己主动返回DOS,可继续向计算机键入命令。
306.作为存储器操作数的标号和变量有三种共同属性:
(1)段值:段基址,可用SEG运算符求得。
(2)偏移值:段内偏移地址。可用OFFSET运算符求得。
307.“?”表示不确定值。仅仅表示预留规定长度的存储空间。
310.操作数是字符串时,内存中存放的是每一个字符的ASCII码
311.复制操作符DUP,表示操作数反复若干次。
指出了段与段寄存器的关系。
319.三个数相加把结果放在SUM单元中。
323.宏调用展开在编译处。在EXE文件里有N份。
326.在汇编中字符就和字符串一样。是同一个概念,都用单引號。字符就是长度为1的字符串。
第一个AND是指令,在运行时起作用。
第二个AND是运算符。在编译时起作用。
第二个“+”是一个表达式,编译时处理。
334.$表示当前地址
335.汇编上机过程:
336.汇编程序的主要功能:
$+6必须是还有一条指令的首地址。
$用在伪操作的參数字段时,表示的是地址计数器的当前值。
347.ORG伪操作:用来设置当前地址计数器的值。
如常数表达式的值为N。则ORG伪操作能够使下一个字节的地址成为常数表达式的值N。
353下列传送指令中有语法错误的是(A)
354.逻辑移位指令SHR用于:D
J寄存器AX的值是(C)
358.简述汇编语言的上机过程:
259.运行段内返回RET指令时,运行的操作是:
260.运行段间返回RET指令时,运行的操作是:
261.其中断发生时。由中断机构自己主动完毕哪些动作?(中断过程)
265.串反复前缀指令
266.在串操作指令前使用反复前缀指令REPE,终止串的反复操作条件是(C)
267.以下指令中,合理而有意义的指令是(D)
MOVS是串传送指令,MOVSB传送一个字节
268.以下的数据传送指令中。错误的操作是(D)
马上数不能直接送段寄存器,即段寄存器仅仅能通过寄存器或存储单元传送数据。
269.运行下列指令后,正确的结果是(B)
适用于測试某一次运算的结果并依据不同的结果做不同的处理。
(4)JNS ;条件SF=0时转移。结果为正则转移。
271.測试BL寄存器内容是否与4FH相等。若相等则转NEXT处运行。代码为(B)
273.PSW寄存器共同拥有6位条件状态位,3位控制状态位。
276.注意NEG是求补,而不是求反。
277.假定(DX)=B。(CL)=3。(CF)=1。试确定下列各条指令单独运行后DX中的值。
RCR:带进位循环右移指令
RCL:带进位循环左移指令
该程序段已占有的存储字节数是多少?
注意:EQU定义的符号名不占存储空间。
ORG是设置该程序段的偏移地址。
282.循环控制指令測试条件
283.循环控制指令LOOPNZ/LOOPNE控制循环继续运行的条件是(B)
284.压缩BCD码指每一个字节存储两个BCD码
285.使计算机运行某种操作的命令是(B)
286.将数据5618H存放在存储单元中的伪指令是(B)
288.如TABLE为数据段中0100单元的符号名,当中存放的内容为0FF00H,下面两条指令有什么差别?AX寄存器的内容各自是什么?
289.对于以下的数据定义,三条MOV指令分别汇编成什么?
。也没有存储器相对寻址!!。
291.无符号数比較时,用“高于”或“低于”来做推断根据。
有符号数比較时,用“大于”或“小于”来做推断根据。
转移指令中,大部分指令能够用两种不同的助记符来表示。
比方。一个数低于还有一个数和一个数不高于也不等于还有一个数是等同的。
即JB和JNAE是等同的。
292.比較两个无符号数的大小
294.变量TABLE中存放了一个偏移地址。当无符号数X小于、等于或大于此偏移地址时,应去运行三个不同的程序段。
295.比較两个有符号数
有符号数比較条件转移指令
296.试分析以下程序段的功能是什么?
推断AL的内容,若为‘A’~‘Z’的大写字母时,程序段 LETTER处理,否则转OTHER处理。
297.计算机中为便于存储及计算机的物理实现,採用(A)。
299.机器指令是在程序执行期间由计算机来执行的。
300.伪指令在程序(B)阶段被处理。
301.在程序的開始能够用NAME或TITLE作为模块的名字。
但NAME和TITLE伪指令不是必要的。
302.一个完整、独立的汇编语言源程序能够没有(C)伪指令。
306.从微处理器的角度来看,计算机结构可分为CPU、内存、和IO子系统三个主要部分。
309.汇编语言程序的最后一条指令是汇编结束伪指令。
310.能够改动其值的定义符号常量的伪指令是等号(=)伪指令。
311.MOV AX,@DATA 中AX的值是由操作系统在程序执行之前传过来的。
313.在8086中。一个逻辑段最长为64K字节。
320.操作系统1号功能调用(输入一个字符)
321.已知在内存中有一个字节单元NUM,存有带符号数据,要求计算它的绝对值后,放入RESULT单元中。
322.编写计算以下函数值的程序:
323.程序:把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示。
324.程序:在ADDR单元中存放着数Y的地址,编一程序把Y中1的个数存入COUNT单元中。
能够依据最高有效位是否为1来计数。然后用移位的方法把各位数逐次移到最高位去。
327.偏移量=偏移地址=有效地址=段内地址
329.过程定义伪指令
336.H计算机刚一启动时,物理地址是多少?
339.实模式就是一般模式。就是我们经常使用的模式。
341.8086微处理器由哪几部分组成?
功能:完毕IOport对累加器的数据输入。
操作:(IO地址表达式)?AL
功能:完毕累加器对IOport的数据输出。
348.输入字符代码:
349.试编制一程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符。如不是,则退出程序。如是。则開始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存放)。直到接收到第二个空格符时退出程序。
分析:这一程序要求接收的字符从空格符開始又以空格符结束,因此程序中必须区分所接收的字符是否是第一个字符。所以。设立作为标志的存储单元FLAG。
一開始将其置为0。接收第一个字符后可将其置1.
351.调用程序和子程序在同一代码段中
352.调用程序和子程序不在同一个代码段中
354.子程序作主程序
366.在微处理器中,PUSH和POP指令在堆栈与寄存器或存储单元之间传送数据时,一次总是传送2个字节。
370.子程序作主程序。必须用FAR
372.期中考试2个编程。
使用该指令前,先在数据段建立一个表格,表格首地址存入BX寄存器中,欲代替码的表内位移量存入AL寄存器。
376.下列指令中哪条是正确的(D)
A错:马上数不能直接送段寄存器。即段寄存器仅仅能通过寄存器或存储单元传送。
B错:源操作数都是变址寄存器。
C错:普通寄存器不能向变址寄存器传数据。
377.使8086/88的标志寄存器F中的中断标志I置为关中断的命令是CLI。
379.SUB AX,[BX]目的操作数的寻址方式是寄存器直接寻址,源操作数採用的寻址方式是寄存器间接寻址。
381. 8088微处理器段内直接寻址64KB字节空间。若寻址1MB字节空间必须通过段寄存器管理实现。
382.设(SS)=2000H。(SP)=0486H,若在堆栈中取出3个数据。则栈顶的物理地址为2048CH。假设又在堆栈中存入3个数据,则栈顶的物理地址是20486H。
注意:堆栈中数据的压入弹出必须以字节为单位,所以PUSH和POP指令仅仅能作字操作。
383.中断系统的中断矢量表用来存放中断类型号,共预留了1KB个字节空间。
387.已知AL=3,分析下列程序段:
388.绘图说明下列语句所分配的存储空间及初始化的数据值。
391.操作数?能够保留存储空间。但不存入数据。
394.依据伪指令代码写内存情况是难点和必考点。
应该再次复习。尤其搞懂关于字符串的存放问题,DB和DW是不一样的,应再次学习。
395.BP、SP可称为指针寄存器
396.一般在作双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位字。
398.段寄存器也是一种专用寄存器。专用于存储器寻址,用来直接或间接的存放地址。段寄存器的长度为16位。
399.在存储器里以字节为单位存储信息。
地址从0開始编号,顺序的每次加1,因此存储器的物理地址空间是线性增长的,在机器里,地址是用二进制表示的,是无符号整数。书写格式使用十六进制数形式。
401.地址编号的范围用十六进制数表示为0000H~FFFFH。
402.存储器特性:内容是能够重复读取的。仅仅有当存入新的信息后。原来的内容就自己主动被覆盖了。
403.仅仅能在实模式下工作,仅仅需了解实模式。
404.80X86存储器在实模式下同意的最大寻址空间为1MB。由于地址总线宽度为20位。
405.每一个段的大小可达64KB。由于地址寄存器是16位的,这样段内地址可用16位表示。
406.在1MB的存储器里,每个存储单元都有一个唯一的20位地址。称为该存储单元的物理地址。
407.CS存放当前正在执行的程序;
DS存放当前执行程序的数据;
SS定义了堆栈所在区域。
408.段寄存器和偏移地址的默认组合
409.寻址方式分为:数据寻址和指令寻址
在微型计算机中,带符号的二进制数都採用补码表示。所以此处的操作数是补码,所以求 –操作数 就是求补操作。
419.有符号数比較大小:机器依据SF标志位来推断大小。即若被减数小于减数,差值为负,则SF=1;否则SF=0。前提是无溢出 OF=0.
421.名字的定义规则:
422.汇编字符串用单引號。如:‘ABC’
逻辑运算符的功能在汇编阶段完毕,逻辑运算指令的功能在运行时完毕。
第一个AND是逻辑运算指令,第二个AND是逻辑运算符
425.在汇编阶段处理:伪指令、宏指令、运算符
428.某系列微机对存储器分段。假设每个段最多的字存储单元(16位二进制)是32K。那么表示段内字节单元偏移地址的二进制位数应是(B)
431.MOV指令中目的操作数不能为马上数和CS。
434.运行下列指令后,AX寄存器中的内容是什么?
435.指令的操作数中,同意出现表达式,比如BUF1与BUF2均为变量名,以下指令中语法正确的是(D)
436.在的马上数寻址方式中,对寄存器的使用下列说法正确的是(D)
437.在DEBUG中,为查看或改动内存单元的内容。使用的命令是(A)
E命令:将内容写入内存
438.对CS段寄存器赋段地址的方法是(B)
(2)段间带马上数返回
440.8086CPU中,一个段最大可定义的字节数是(C)
441.软中断指令INT 21H运行,若AH=9时则完毕的功能是显示字符串。
444.编写指令将附加段中的一个字节变量COUNT送给AL寄存器。
446.最后移位指令吐血总结:
RCL:带进位的循环左移,每一位先加上CF的值,然后循环左移到最低位。原来的CF移到最低位;
将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第13篇,我尽量每周四篇
OpenMIPS处理器在设计的时候就计划与MIPS32指令集架构兼容,所以可以使用MIPS32架构下已有的GNU开发工具链。本节将说明如何安装使用GNU开发工具链以及如何制作Makefile文件,从而以更加方便、快捷、自动的方式对测试程序进行编译,并得到指令存储器ROM的初始化文件inst_rom.data。
GNU工具链要安装在Linux环境下,大多数读者使用的可能都是Windows平台,可以首先安装Linux虚拟机,再在Linux虚拟机中安装GNU工具链。笔者推荐使用OpenCores站点上提供的一个Linux虚拟机镜像,该虚拟机预装的是Ubuntu系统。
下载最新的那个文件就可以了,笔者使用的是版。下载完成后解压该文件,大约4GB左右。此时还需要下载VisualBox才可以打开该文件。VisualBox是一款开源的虚拟机软件,本书使用的是4.1.22版。下载完成后安装VisualBox,安装完成后打开VisualBox,界面如图4-15所示。
点击“新建”出现“新建虚拟机”向导,点击“下一步”,出现如图4-16所示界面。
内存大小依据计算机情况设置,本人设置的是512M,已经够用了,毕竟我们需要编译的程序都是十分简单的,点击下一步,选择“使用现有的虚拟硬盘”,然后选择解压后的虚拟机文件,如图4-18所示。
点击“下一步”,VisualBox会将用户刚才的设置都列出来,确认无误后,点击“创建”,这样虚拟机就创建好了。启动虚拟机,显示如图4-19所示。
至此Linux虚拟机就已经安装好了,还需要多做一步工作,就是设置虚拟机与Windows宿主机之间的共享,这样方便以后在两个系统之间传递文件。先关闭Ubuntu虚拟机,然后打开VisualBox中虚拟机的设置界面,选择“共享文件夹”,如图4-20所示。
在其中选择共享文件夹的路径,设置名称,参考图4-21所示设置。设置完成后,可以启动虚拟机,打开终端,输入命令:
该命令的作用是将共享文件夹挂载在/mnt/目录下,sudo表示以Root用户身份执行该命令,终端会提示输入密码,Ubuntu虚拟机默认Root用户的密码是openrisc。这样就实现了虚拟机与宿主机的文件共享,对虚拟机而言共享文件放在/mnt/路径下,对宿主机而言共享文件放在图4-21所示的F盘UbuntuShareFolder文件夹下。
在本书附带光盘的tools目录下提供了GNU工具链安装文件,文件名是mips-sde-elf-i686-pc-linux-gnu.tar.tar,将该文件复制到上一小节设置的共享文件夹下,即可通过Ubuntu虚拟机访问该文件。将安装文件复制到Ubuntu的/opt目录下,打开Ubuntu的终端,使用如下命令解压缩:
重启后,打开终端,在其中输入mips-sde-elf-,然后按两次Tab键,会列出刚刚安装的,针对MIPS平台的所有编译工具,如图4-22所示,表示GNU工具链安装成功。
GNU工具链包含很多工具,但我们需要使用的不多,主要的几个工具如下。此处使用的是通用名,针对MIPS平台的工具,会在名称前增加“mips-sde-elf-”前缀。
本小节就使用GNU工具编译4.3节的测试程序。首先在Ubuntu虚拟机中新建一个文件,文件名为inst_rom.S,内容如下。相比4.3节的测试程序,多了三条编译指导语句。
对“set noat”做进一步说明,这是一个汇编控制伪操作。在第1章介绍MIPS32架构中的通用寄存器时已经提到MIPS32中的通用寄存器都有约定名称,其用法也遵循一些约定,比如:寄存器$1,编程时的约定名称为at,一般留给汇编器使用,程序中不直接使用。如果直接使用,汇编器会发出警告,此处设置“set noat”就是表示可以自由使用寄存器$1,汇编器不会发出警告。
在Ubuntu中打开终端,使用cd命令将路径调整到上述inst_rom.S所在目录,然后使用如下命令编译代码。其中添加了“-mips32”选项,表示按照MIPS32指令集架构进行编译。
为了便于读者理解,下面将简单介绍一下ELF文件,读者朋友如果对这不感兴趣或者希望尽快了解编译链接过程的可以跳过下面的介绍,直接阅读4.4.4节。
(1)可重定位(Relocatable)文件:保存着代码和适当的数据,用来和其他Object文件一起创建一个可执行文件或共享文件。
(2)可执行(Executable)文件:保存着一个用来执行的程序,该文件指出了如何来创建程序进程映象。
(3)共享目标文件:包含了在两种使用环境中链接的代码和数据。首先链接器(ld)可以将它和其余可重定位文件和共享目标文件一起处理,生成另外一个目标文件(比如:编译器和链接器把*.o和*.so一起装配成一个*.exe文件)。其次,动态链接器(Dynamic Linker)可将它与某个可执行文件以及其它共享目标文件组合在一起创建进程映像(比如:动态加载器把*.exe程序和*.so加载进内存执行)。
开始四个字节是固定不变的:0x7F,紧接着是ELF三个字符的ASCII码,这四个字节表明这个文件是一个ELF文件。此处以inst_rom.o为例,介绍e_ident字段后面字节的含义,参考图4-23。
通过编译得到了一个可重定位ELF文件,但这个文件还不能执行,需要通过链接转化为可执行文件,然后才能执行。使用链接工具mips-sde-elf-ld完成这项工作,在mips-sde-elf-ld的参数中需要声明一个链接描述脚本,链接描述脚本描述了输入文件的各个Section如何映射到输出文件的各个Section中,并控制输出文件中Section和符号的内存布局。可以通过新建一个Document作为链接描述脚本,文件名为ram.ld,内容如下。
.data存放在输出文件的.data中,输入文件的Section .bss存放在输出文件的.bss中。最后的Entry指定程序的入口地址,也就是第一条执行的指令地址是_start符号的值,从汇编代码中可知_start符号就是0x0。现在就可以使用链接器了,在Ubuntu虚拟机的终端中输入如下命令。
Section加载入内存后,会使得内存从地址0x0开始的0x10个字节存放的就是测试程序的4条指令。
分析到这里,读者是不是对编译、链接过程有了比之前更深的了解?其实这些背景知识与OpenMIPS处理器关系不大,但是知道这些有助于理解编译链接的过程。总结一下,编译链接的过程很简单,只需要两步,如下。
上一小节得到的inst_rom.om是一个ELF格式的可执行文件,与我们希望的指令存储器ROM初始化文件inst_rom.data的格式有很大区别,需要进行格式转化。在GNU工具链中提供了另一个工具mips-sde-elf-objcopy,用于将一种格式的目标文件转化成另外一种格式。在这里,可以使用mips-sde-elf-objcopy得到inst_rom.om的二进制(Binary)形式,使用方法如下。得到的二进制文件inst_rom.bin的内容如图4-29所示。
从图4-29可以发现,bin文件的内容正是测试程序中4条指令对应的二进制字,现在只需要编写一个小程序将bin文件转化为ModelSim中存储器初始化文件的格式。这个小程序很简单,此处不再列出代码,在本书附带的光盘中可以找到源程序,程序名为Bin2Mem.exe,使用方法如下。得到的inst_rom.data文件如图4-30所示。
未完待续,后续将上传第4阶段的代码!
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。