汇编语言-寻址方式
- 格式:ppt
- 大小:1.47 MB
- 文档页数:10
汇编语言基于x86处理器课后答案第七版在进行汇编语言基于x86处理器课后答案第七版的整理和总结前,我们先回顾一下课程的主要内容。
本课程主要涉及汇编语言的基础知识、x86处理器的体系结构、汇编语言的程序设计等内容。
通过本课程的学习,我们能够了解并掌握x86汇编语言的编写和调试方法,为以后的系统级编程和软件优化打下坚实的基础。
那么,在开始答案的整理之前,我们首先来了解一下第七版的课后习题。
第七版的课后习题分为多个章节,包含了大量的问题和编程练习。
这些习题涵盖了课程的各个方面,从基础的概念理解到实际的程序设计。
下面,我们就以第七版课后习题中的几个问题为例,进行答案的整理和讲解。
1. 问题一:请解释x86汇编语言中的寻址方式,并举例说明。
在x86汇编语言中,寻址方式是指指令如何访问和操作内存中的数据和地址。
x86处理器提供了多种寻址方式,包括直接寻址、寄存器间接寻址、立即寻址等。
直接寻址是最简单的寻址方式,指令中直接给出了要访问的内存地址。
例如,mov ax, [0x1234]表示将地址为0x1234的内存单元中的数据传送到寄存器ax中。
寄存器间接寻址是指令中使用寄存器来传送地址。
例如,mov ax, [bx]表示将寄存器bx中的值作为地址,读取该地址中的数据,并传送到寄存器ax中。
立即寻址是指令中直接给出了要操作的数据。
例如,mov ax, 1234表示将立即数1234传送到寄存器ax中。
2. 问题二:请解释x86汇编语言中的标志位,并说明其作用。
在x86汇编语言中,标志位是由处理器中的标志寄存器(FLAGS)中的各个标志位组成的。
这些标志位用来表示当前程序执行的状态或者某些操作的结果。
常用的标志位包括零标志位(ZF)、进位标志位(CF)、溢出标志位(OF)等。
ZF用来表示最近的运算结果是否为零,当最近的运算结果为零时,ZF被置为1,否则为0。
CF用来表示最近的运算结果是否产生了进位或借位,当最近的运算结果产生了进位或借位时,CF被置为1,否则为0。
汇编语⾔--操作数的寻址⽅式(三)三、操作数的寻址⽅式操作数是指令或程序的主要处理对象。
如果某条指令或某个程序不处理任何操作数,那么,该指令或程序不可能有数据处理功能。
在CPU的指令系统中,除NOP(空操作指令)、HLT(停机指令)等少数指令之外,⼤量的指令在执⾏过程中都会涉及到操作数。
所以,在指令中如何表达操作数或操作数所在位置就是正确运⽤汇编指令的⼀个重要因素。
在指令中,指定操作数或操作数存放位置的⽅法称为寻址⽅式。
操作数的各种寻址⽅式是⽤汇编语⾔进⾏程序设计的基础,也是本课程学习的重点之⼀。
微机系统有七种基本的寻址⽅式:⽴即寻址⽅式、寄存器寻址⽅式、直接寻址⽅式、寄存器间接寻址⽅式、寄存器相对寻址⽅式、基址加变址寻址⽅式、相对基址加变址寻址⽅式等。
其中,后五种寻址⽅式是确定内存单元有效地址的五种不同的计算⽅法,⽤它们可⽅便地实现对数组元素的访问。
另外,在32位微机系统中,为了扩⼤对存储单元的寻址能⼒,增加了⼀种新的寻址⽅式——32位地址的寻址⽅式。
为了表达⽅便,我们⽤符号“(X)”表⽰X的值,如:(AX)表⽰寄存器AX的值。
1、⽴即寻址⽅式操作数作为指令的⼀部分⽽直接写在指令中,这种操作数称为⽴即数,这种寻址⽅式也就称为⽴即数寻址⽅式。
⽴即数可以是8位、16位或32位,该数值紧跟在操作码之后。
如果⽴即数为16位或32位,那么,它将按“⾼⾼低低”的原则进⾏存储。
例如:MOV AH, 80H ADD AX, 1234H MOV ECX, 123456HMOV B1, 12H MOV W1, 3456H ADD D1, 32123456H其中:B1、W1和D1分别是字节、字和双字单元。
以上指令中的第⼆操作数都是⽴即数,在汇编语⾔中,规定:⽴即数不能作为指令中的第⼆操作数。
该规定与⾼级语⾔中“赋值语句的左边不能是常量”的规定相⼀致。
⽴即数寻址⽅式通常⽤于对通⽤寄存器或内存单元赋初值。
图3.1是指令“MOV AX, 4576H”存储形式和执⾏⽰意图。
汇编语言程序设计试题及答案一.名词解释(本大题共5小题,每小题3分,共15分)试解释下列名词的含义。
1.寄存器:计算机系统内,位于CPU内部的存储单元,CPU访问此类存储单元不需要使用总线。
2.物理地址:CPU通过地址总线向外发送的20位地址,在访问内存单元前,CPU必须先将CPU内部的逻辑地址转换为物理地址。
3.段基值:逻辑地址的一个组成部分,用于指示一个段在内存中的起始地址。
4.寻址方式:指令获取操作数的方式。
5.补码:计算机系统内部用于表示带符号数的一种编码,正整数的补码为其真值本身,负整数的补码为其真值变反加1的结果。
二.计算题(本大题共5小题,每小题4分,共20分)试按照各小题的要求给出计算结果。
1.将十进制数100分别转换为二进制、十六进制数,它们的表示形式分别为多少?答案:二进制为 01100100B,十六进制为64H2.假设(DS)=0C00H,(BX)=0210H,对于指令MOV DS:100H[BX],AL,其目的操作数的物理地址为多少?答案:EA = (BX)+0100H = 0310H,物理地址 = (DS)*16 + EA = 0C000H + 0310H = 0C310H3.假设(BX)=0100H,(SI)=0020H,对于指令ADD DL,[BX][SI],其源操作数的偏移量为多少?答案:EA = (BX)+(SI)+ 0 = 0120H4.假设当前(SP)=0060H,连续执行5条PUSH指令后,(SP)=?答案:每执行一条PUSH指令,(SP)被减2,因此执行5条PUSH指令后,(SP)=0060H – 5*2 =0060H -000AH = 0056H5.对于一个十进制数– 80,其二进制补码表示形式为多少?答案:首先求得二进制真值为– 01010000B,负数补码为变反加1的结果,即 10110000B三.排错题(本大题共4小题,每小题5分,共20分)每小题列出了一条指令,判断该指令有无语法错误,如果存在语法错误,请指出具体的错误原因,判断正确给2分,分析正确给3分,判断错误不给分。
在汇编语言中,寻址方式指的是指令如何访问内存中的操作数或数据。
不同的处理器体系结构支持不同的寻址方式。
以下是一些常见的寻址方式:立即寻址(Immediate Addressing):操作数直接包含在指令中。
例如:MOV AX, 5 ; 将寄存器AX 设置为立即数5寄存器寻址(Register Addressing):操作数位于寄存器中。
例如:MOV AX, BX ; 将寄存器BX 的值移动到寄存器AX直接寻址(Direct Addressing):操作数的地址直接指定在指令中。
例如:MOV AX, [1234] ; 将内存地址1234 处的数据移动到寄存器AX寄存器间接寻址(Register Indirect Addressing):指令中包含一个寄存器,该寄存器包含操作数的地址。
例如:MOV AX, [BX] ; 将寄存器BX 中存储的地址处的数据移动到寄存器AX基址寻址(Base Addressing):使用基址寄存器加上一个偏移量来计算内存地址。
例如:MOV AX, [BX + 10] ; 将寄存器BX 加上偏移量10 后的地址处的数据移动到寄存器AX相对寻址(Relative Addressing):操作数的地址是相对于当前指令位置的偏移量。
例如:JMP label_name ; 无条件跳转到标签label_name 处变址寻址(Indexed Addressing):使用一个寄存器的值作为基址,另一个寄存器的值作为偏移量。
例如:MOV AX, [SI + DI] ; 将寄存器SI 和DI 中的值相加,然后将结果作为地址处的数据移动到寄存器AX相对基址寻址(Relative Base Addressing):使用基址寄存器和相对偏移量的组合。
例如:MOV AX, [BX + 10] ; 将寄存器BX 加上偏移量10 后的地址处的数据移动到寄存器AX这只是一些基本的寻址方式,具体的汇编语言和处理器架构可能会有其他特定的寻址方式。
第一讲第三章 指令系统--寻址方式回顾: 8086/8088的内部结构和寄放器,地址分段的概念,8086/8088的工作进程。
重点和纲要:指令系统--寻址方式。
有关寻址的概念;6种大体的寻址方式及有效地址的计算。
教学方法、实施步骤时间分配 教学手段 回 顾 5”×2 板书 计算机 投影仪 多媒体课件等讲 授 40” ×2 提 问 3” ×2 小 结2” ×2教学内容:8086/8088寻址方式操作码 操作数 …… 操作数运算机中的指令由操作码字段和操作数字段组成。
操作码:指运算机所要执行的操作,或称为指出操作类型,是一种助记符。
操作数:指在指令执行操作的进程中所需要的操作数。
该字段除能够是操作数本身外,也能够是操作数地址或是地址的一部份,还能够是指向操作数地址的指针或其它有关操作数的信息。
寻址方式就是指令顶用于说明操作数所在地址的方式,或说是寻觅操作数有效地址的方式。
8086/8088的大体寻址方式有六种。
1.当即寻址所提供的操作数直接包括在指令中。
它紧跟在操作码的后面,与操作码一路放在代码段区域中。
如图所示。
例如:MOV AX,3000H当即数能够是8位的,也能够是16位的。
若是16位的,则存储时低位在前,高位在后。
当即寻址主要用来给寄放器或存储器赋初值。
2.直接寻址操作数地址的16位偏移量直接包括在指令中。
它与操作码—起寄存在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄放器DS加上这16位地址偏移量。
如图2-2所示。
例如:MOV AX,DS:[2000H];图2-2(对DS来讲能够省略成MOV AX,[2000H],系统默以为数据段)这种寻址方式是以数据段的地址为基础,可在多达64KB的范围内寻觅操作数。
8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。
现在只要在指令中指明是段超越的,则16位地址偏移量能够与CS或SS或ES相加,作为操作数的地址。
浅析汇编语言中寻址方式的区别浅析汇编语言中寻址方式的区别浅析汇编语言中寻址方式的区别王传俊寻址方式是汇编语言中的一个重要内容,是学习编程的基础,同时也是该门课程的一个学习难点。
本文通过以Inte18086CPU为例,使用分析比较的方法阐述了各寻址方式间的区别。
汇编语言寻址方式有效地址物理地址在计算机应用技术的发展过程中,汇编语言是一座连接软件和硬件的桥梁,也是计算机能够提供给用户最快而又最有效的语言。
汇编语言不同于用O,1数字表示的机器语言,它是用人们熟悉的英文缩写字符表示相应的操作码,用符号或数值表示地址和操作数。
因此,汇编语言为程序的编写、阅读和修改提供了方便。
但由于汇编语言仍是一种面向机器的语言,所以在进行程序设计时必须考虑到机器的指令系统、寻址方式及存储设备的设置和功能,而熟悉并灵活地应用机器所采用的各种寻址方式,是运用汇编语言进行程序设计的根本。
而一个指令系统具有哪几种寻址方式,是否为编写程序提供方便,是指令系统设计的关键,同时也是初学者学习汇编语言的难点。
在教学过程中,通常选用Inte18086CPU的PC机为基础机型来组织教学。
Inte18086提供了九类寻址方式,它们分别是立即寻址、寄存器寻址、寄存器间接寻址、直接寻址、变址寻址、基址变址寻址、串寻址、端口寻址和隐含寻址。
由于Inte18086中的寻址方式有相似之处,极易混淆。
在教学过程中,应使学生抓住各种寻址方式的特点,找出它们之间的区别和联系,从而形成正确的概念。
什么是寻址方式呢?这是首先要明确的概念。
一个指令是由操作码和操作数两部分组成的。
操作数在存储器中存放的位置,称为操作数地址。
获得操作数地址的方式,就称为操作数地址的寻址方式,简称寻址方式。
在寻址过程中,操作数的存放位置决定着寻址的方式。
在汇编语言的学习过程中,区分“存放位置”是理解寻址方式的’前提。
因此,在学习之前应使学生理解寄存器和存储器的不同。
寄存器位于CPU内部,它的存取速度比存储器要快得多。
一、实验目的1.定位内存单元的寻址方式汇总2.寻址方式的综合应用3.转移指令的分类和原理4.熟悉在显存中编程的方法二、实验内容及要求(一)寻址方式的汇总及综合应用1. 定位内存单元的寻址方式有几种,并举例说明。
2. 寻址方式在结构化数据访问中的应用。
Power idea公司从1975年成立一直到1995年的基本情况如下。
年份收入(千美元) 雇员人均收入(千美元) 1975 16 3 ?1976 22 7 ?1977 382 9 ?1978 1356 13 ?1979 2390 28 ?1980 8000 38 ?M1995 5937000 17800 ?下面的程序中,已经定义好了这些数据:assume cs:codesgdata segmentdb '1975','1976','1977','1978','1979','1980','1981','1982','1983'db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995';年份dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;公司总收入dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,15257,17800;公司雇员人数data endstable segmentdb 21 dup('year summ ne ??')table ends编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中。
汇编语⾔-寻址⽅式-地址和数据相关的寻址⽅式数据相关的寻址⽅式1 ⽴即寻址⽅式直接使⽤⽴即数来处理mov al,5mov ax,3064H2 寄存器寻址⽅式操作数在寄存器中,直接使⽤寄存器赋值来读取内部的操作数。
另外的⽅式的简介:在8086中把操作数的偏移地址称为有效地址,以下的操作都是取得有效地址(EA)的不同途径。
有效地址可以由以下四种成分:位移量(displacement):存放的是⼀个地址。
基址(base):基址部分,通常⽤来指数据段中数据或字符串的⾸地址变址(index):存放在变址寄存器中的内容。
通常⽤来访问数组中的某个元素或字符串的某个字符。
⽐例因⼦(scale factor):是386新增加的寻址⽅式的术语,值可为1,2,4,8在寻址中,可⽤变址寄存器内容乘以⽐例因⼦来取得变址值。
有效地址的计算公式可⽤由以下来处理:EA = 基址 + (变址 X ⽐例因⼦) + 位移量除了⽐例因⼦固定,其它三个都可以有正负。
四种成分16位寻址32位寻址位移量0,8,16位0,8,32位基址寄存器BX,BP任何32位通⽤寄存器变址寄存器SI,DI除ESP外的32位通⽤寄存器⽐例因⼦⽆1,2,4,8表格⼀默认段选择规则访存类型所⽤段及段寄存器却省选择规则指令代码段 CS寄存器⽤于取指堆栈堆栈段 SS寄存器所有的堆栈的进栈和出栈,任何⽤ESP或EBP作为基址寄存器的访问局部数据数据段 DS寄存器除相对于堆栈以及串处理指令的⽬的以外的所有数据访问⽬的串附加数据段 ES寄存器串处理指令的⽬的串表格⼆3 直接寻址⽅式操作数的有效地址只包含位移量这⼀种成分。
值就在代码段中指令的操作码之后。
也就是位移量就是操作数的有效地址。
;假设(ds) = 3050Hmov ax,[0000] ;就是把内存在3050:0000内存的数据传送到ax中也可以⽤符号地址代替数值地址⽐如mov ax,[VALUE];就是把value的3050:value将value替换为数据跟上⼀样也可以⽤指定段寄存器来作为段地址也是可以的。
七种寻址方式标签:it一、立即寻址方式操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。
立即数可以是8位、16位或32位,该数值紧跟在操作码之后。
如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。
例如:MOV AH, 80H ADD AX, 1234H MOV ECX, 123456HMOV B1, 12H MOV W1, 3456H ADD D1, 32123456H其中:B1、W1和D1分别是字节、字和双字单元。
以上指令中的第二操作数都是立即数,在汇编语言中,规定:立即数不能作为指令中的第二操作数。
该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致。
立即数寻址方式通常用于对通用寄存器或内存单元赋初值。
图是指令“MOV AX, 4576H”存储形式和执行示意图。
二、寄存器寻址方式指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。
把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
指令中可以引用的寄存器及其符号名称如下:8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。
寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。
1、源操作数是寄存器寻址方式如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。
其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。
在第4章将会学到如何定义它们。
2、目的操作数是寄存器寻址方式如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。
3、源和目的操作数都是寄存器寻址方式如:MOV EAX, EBX MOV AX, BX MOV DH, BL等。
七种寻址方式举例例题:
1. 立即寻址:指令直接包含操作数,不需要经过任何地址计算。
例:MOV AL, 5 //把5赋值给AL寄存器。
2. 寄存器寻址:操作数在寄存器中,不需要经过任何地址计算。
例:MOV AX, CX //把CX寄存器的内容(即计数器的值)赋给AX寄存器。
3. 寄存器间接寻址:操作数需要经过地址计算才能取出,常用于寄存器间接寻址。
例:MOV DX, 8000H //把偏移地址8000H处的数据(即偏移地址加起来,实质是访问内存地址)赋给DX寄存器。
4. 直接寻址:指令直接给出操作数,需要经过地址计算。
例:MOV AL, [DX] //把偏移地址为DX的数据赋给AL寄存器。
5. 零页寻址:对于某一段指令来说,0页至1页的1024个字节被作为一个整体来处理,称这一段地址为零页。
例:MOV AX, [0F00H] //把偏移地址为0F00H的数据(即偏移地址加起来,实质是访问内存地址)赋给AX寄存器。
6. 间接寻址:指令给出的是内存地址,需要经过地址计算才能取出操作数。
例:MOV AX, [ES:DX] //把ES段的偏移地址DX(即ES段中偏移地址为DX的数据)处的数据赋给AX寄存器。
7. 偷窥寻址:在X86指令集中,有些指令后面可以跟一个“偷窥”码,该码指示该指令后面紧跟的某一条指令(即偷窥指令)被执行时,其内容被自动设置为零。
例如,在8086微处理器的汇编语言中,LOP指令用于循环执行一段指令,当执行LOP时,LOP后面的指令被执行,其内容被自动设置为零。