汇编语言第三章
第三章 习题和思考题参考答案(汇编语言)
![第三章 习题和思考题参考答案(汇编语言)](https://img.taocdn.com/s3/m/2b313d7327284b73f2425023.png)
第三章习题和思考题(汇编语言)一.填空题1.在汇编语言中标号的类型有NEAR 和FAR,变量的类型有BYTE、WORD、DWORD 、QWORD、TBYTE。
2.在汇编语言中,一个过程的属性为NEAR,表明主程序和子程序在同4一代码段中;若为FAR,则表明主程序和子程序不在同一代码段中。
3.下列程序运行后,X单元的内容为140。
.MODEL SMALL.DATAX DW 10Y DW 20Z DW 100,40,66,80.CODE.STARTUPMOV BX, OFFSET ZMOV AX, [BX]MOV Y, AXMOV AX, [BX+2]ADD AX, YMOV X, AX.EXITEND4.以下程序执行后,(AX)=5501H。
……A DW 124H,345H,128H,255H,512H,127H,678H,789HB DW 5……MOV BX, OFFSET AMOV SI, BMOV AX, [BX+SI]二.选择题1.完成41H送[2100H],42H送[2101H]的正确程序段是B 、C。
A. MOV AL, 41HB. MOV SI, 2100HMOV [2100H], AL MOV [SI], ‘A’INC 41H INC SIMOV [2100H], AL MOV [SI], ‘B’C. MOV AX, 4241HD. MOV AX, ‘AB’MOV [2100H], AX MOV [2100H], AX2. 在汇编过程中不产生指令码,只用来指示汇编程序的指令是 C 。
A. 汇编指令B. 机器指令C. 伪指令D. 宏指令三.问答题1.什么是指令语句?什么是伪指令语句?它们的主要区别是什么?答:指令语句经过汇编后要产生机器码,而伪指令语句不产生机器码;指令语句和机器的一种操作相对应,而伪指令语句和机器的一种伪操作(汇编过程)相对应。
2. 试计算下列伪指令中各变量所分配的字节数A1 DW 20A2 DW 8DUP(?),10,20A3 DD 10DUP(?)A4 DB 3DUP(?,4DUP(0))A5 DB ‘Happy New Year!!’答:变量A1、A2、A3、A4、A5分配的字节数分别为2 、20、40、15、16 四.阅读程序1.请把下列程序中所缺语句补充完整,并回答问题:TITLE EXAMPLE.ASMDATA SEGMENTA DW 0B DW 0C DW 230, 20, 54(1) DATA ENDSCODE SEGMENTASSUME (2) CS:CODE DS:DATAPROG PROC FARSTART:MOV AX,DATA(3) MOV DS, AXMOV BX,OFFSET CMOV AX,[BX]MOV B,AXMOV AX,2[BX]ADD AX,BMOV A,AXEXIT: MOV AH, 4CHINT 21HCODE ENDS_(4) END START问题: 1.程序执行完后,A单元的内容是多少? 2502.在以ES:SOC1为起始地址的表中存有字符串,它以NULL(00H)作为串结束符。
汇编语言第三章答案
![汇编语言第三章答案](https://img.taocdn.com/s3/m/1bc3aa1052d380eb62946da9.png)
3.1 给定(BX)=637DH,(SI)=2A9BH,位移量D=7237H,试确定在以下各种寻址方式下的有效地址是什么?(1) 立即寻址(2) 直接寻址(3) 使用BX的寄存器寻址(4) 使用BX的简接寻址(5) 使用BX的寄存器相对寻址(6) 基址变址寻址(7) 相对基址变址寻址答:(1) 操作数在指令中,即立即数;(2) EA=D=7237H;(3) 无EA,操作数为(BX)=637DH;(4) EA=(BX)=637DH;(5) EA=(BX)+D=0D5B4H;(6) EA=(BX)+(SI)=8E18H;(7) EA=(BX)+(SI)+D=1004FH;超过了段的边界,最高进位位丢失,因此EA=004FH。
3.2 试根据以下要求写出相应的汇编语言指令(1) 把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器中。
(2) 用寄存器BX和SI的基址变址寻址方式把存储器中的一个字节与AL寄存器的内容相加,并把结果送到AL寄存器中。
(3) 用寄存器BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和(CX)相加,并把结果送回存储器中。
(4) 用位移量为0524H的直接寻址方式把存储器中的一个字与数2A59H相加,并把结果送回存储单元中。
(5) 把数0B5H与(AL)相加,并把结果送回AL中。
答:(1) ADD DX, BX(2) ADD AL, [BX][SI](3) ADD [BX+0B2H], CX(4) ADD WORD PTR [0524H], 2A59H(5) ADD AL, 0B5H3.3 写出把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令。
要求使用以下几种寻址方式:(1) 寄存器间接寻址(2) 寄存器相对寻址(3) 基址变址寻址答:(1) MOV BX, OFFSET BLOCKADD BX, (6–1)*2MOV DX, [BX](2) MOV BX, OFFSET BLOCK 改为:MOV BX, (6-1)*2MOV DX, [BX+(6–1)*2] 也可MOV DX, BLOCK[BX](3) MOV BX, OFFSET BLOCKMOV SI, (6–1)*2MOV DX, [BX][SI]3.4 现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=B7H,(21203H)=65H,试说明下列各条指令执行完后AX寄存器的内容。
第三章 汇编语言程序设计
![第三章 汇编语言程序设计](https://img.taocdn.com/s3/m/2f17bf45b307e87101f69633.png)
第3章 汇编语言程序设计 章
3.2 汇编语言源程序的格式
பைடு நூலகம்
名字: 名字:变量和标号
变量名 段名 过程名:指示性语句中的名字.内存单元的名 变量名/段名 过程名:指示性语句中的名字. 段名/过程名
定义. BUF DB ? 字,由DB/DW/DD定义. 由 定义 变量的三种属性: 变量的三种属性: 段值 SEG 偏移量 OFFSET 类型 BYTE/WORD/DWORD 标号:指令性语句中的名字.指令存放单元的符号地址. 标号:指令性语句中的名字.指令存放单元的符号地址. LOOPER: MOV AL,DATA[SI] 标号的三种属性: 标号的三种属性: 段值 SEG 偏移量 OFFSET 类型 NEAR/FAR 对于汇编程序来说,变量和标号都是存储单元的符号地址. 注:对于汇编程序来说,变量和标号都是存储单元的符号地址. 只是标号对应的存储单元中存放的是指令, 只是标号对应的存储单元中存放的是指令,而变量所对应的 存储单元存放的是数据. 存储单元存放的是数据.
令和数据. 令和数据. 汇编语言(Assenbly Lauguage):用助记符来编写 汇编语言( Lauguage): 指令,地址和数据也可用符号表示. 指令,地址和数据也可用符号表示.用汇编语言 编写的程序必须翻译成机器语言目标程序( 编写的程序必须翻译成机器语言目标程序(或目 标代码)才能执行,这种翻译过程称为汇编 汇编. 标代码)才能执行,这种翻译过程称为汇编. 高级语言:不针对某个具体的计算机,通用性强. :不针对某个具体的计算机,通用性强. 但高级语言编写的源程序同样必须"翻译" 但高级语言编写的源程序同样必须"翻译"成机 器语言,计算机才能执行, 器语言,计算机才能执行,所用的系统软件称为 编译程序或解释程序. 编译程序或解释程序.
第三章 汇编语言程序及实现
![第三章 汇编语言程序及实现](https://img.taocdn.com/s3/m/e13cc4b869dc5022aaea00cb.png)
2013-8-13
河南师范大学计算机与信息技术学院
29
汇编语言程序设计——方法、技术、应用
2. 属性指定操作
格式:THIS 类型名 利用THIS说明的操作数具有汇编时的当前逻辑地址,但具有指 定的类型。 LABEL伪指令的功能等同于‚EQU THIS‛。
示例1
示例2
2013-8-13
河南师范大学计算机与信息技术学院
河南师范大学计算机与信息技术学院
25
汇编语言程序设计——方法、技术、应用
运算符的优先级
1 2 3 4 5 6 7 8 9 10 () <> [] · LENGTH SIZE WIDTH MASK PTR OFFSET SEG TPYE THIS : HIGE LOW * / MOD SHL SHR + EQ NE GT LT GE LE NOT AND 建议采用圆括号‚()‛ OR XOR 显式表达,它可以极大 SHORT 地提高程序的可阅读性。
量
2013-8-13
河南师范大学计算机与信息技术学院
13
汇编语言程序设计——方法、技术、应用
1.常量
常量表示一个固定的数值。不占存储空间。
常量在程序中可以直接出现,对于经常使用的常量可以定义为符号常量。 常量在伪指令语句中主要用于给变量赋初值,在指令语句中常用作立即 数及存储器寻址方式中的位移量。 数值常量可以是二、八、十、十六进制数。 字符常量是将字符用单引号或双引号界定; 字符串常量是将字符串用单引号或双引号引起,单引号字符本身用连 续两个单引号引起。 各种符号的属性值可作为常量使用,称为属性常量。
2013-8-13
河南师范大学计算机与信息技术学院
28
汇编语言程序设计——方法、技术、应用
汇编语言(微机)第三章
![汇编语言(微机)第三章](https://img.taocdn.com/s3/m/a1d6f4d86c85ec3a86c2c5b8.png)
汇编语言源程序的格式
一般情况下,定位类型、组合类型和类别说明可以 不用。 注意:SEGMENT和ENDS语句必须成对使用。 例:定义一数据段DATA
DATA SEGMENT A DB '1234' B DW 12H
DATA ENDS
22
汇编语言源程序的格式
(2)偏移地址定位语句 ORG 格式:ORG 数值表达式 功能:指定在它之后的程序段或数据块所存放的起始地 址的偏移量。
SUB1: ?
RESU: ?
?
31
汇编语言源程序的格式
④ 用DUP重复因子初始化一个数据区
格式:N DUP (表达式)
?、数值、
数值表达式
重复次数 重复装入的内容
字符等
例1: DA1 DB 2 DUP(0) DA2 DB 2 DUP(‘AB’) DA3 DW 2 DUP(1)
DA1
00
00
DA2
41
LOP: ADD AL,[BX] ADC AH,0 INC BX LOOP LOP MOV [DI] ,AX MOV AH ,4CH INT 21H
CODE ENDS END START
9
汇编语言源程序的格式
汇编语言源程序的格式
二、指令性语句 [标号:] 操作码 [操作数] [;注释项]
操作码:指明操作的性质,说明计算机要执行的具体操 作。用助记符表示。
第三章:8086汇编语言程序设计
主讲教师:范新民
整理ppt
1
8086汇编语言程序设计
1 3.2.1 汇编语言源程序的格式 2 3.2.2 常量、标识符和表达式 3 3.2.3 指示性语句 4 3.2.4 指令性语句 5 3.2.5 宏指令
《汇编语言》第三章 课件05
![《汇编语言》第三章 课件05](https://img.taocdn.com/s3/m/e53f47f1941ea76e58fa04ca.png)
3.9 push、pop指令
push和pop指令的格式(2) push 段寄存器:将一个段寄存器中的 数据入栈 pop段寄存器:出栈,用一个段寄存器 接收出栈的数据 例如:push ds pop es
3.9 push、pop指令
push和pop指令的格式(3) push内存单元:将一个内存单元处的字入栈 (栈操作都是以字为单位) pop 内存单元:出栈,用一个内存字单元接 收出栈的数据 例如:push [0] pop [2]
实际情况:8086CPU中并没有这样的寄存器。
3.8 栈顶超界的问题
8086CPU不保证对栈的操作不会超界。 这就是说, 8086CPU 只知道栈顶在何 处(由SS:SP指示),而不知道读者安 排的栈空间有多大。这点就好像 ,CPU 只知道当前要执行的指令在何处(由 CS:SP指示)而不知道读者要执行的指 令有多少。 从这两点我们可以看出
pop 指令的执行过程
pop ax (1)将SS:SP指向的内存单元处的数 据送入ax中; (2)SP = SP+2,SS:SP指向当前栈顶 下面的单元,以当前栈顶下面的单元 为新的栈顶。
图示
pop 指令的执行过程
注意
pop 指令的执行过程
注意:
出栈后,SS:SP指向新的栈顶
3.8 栈顶超界的问题
8086CPU的工作机理,只考虑当前的情 况: 当前栈顶在何处; 当前要执行的指令是哪一条。
结论
3.8 栈顶超界的问题
结论:
我们在编程的时候要自己操心栈顶超 界的问题 ,要根据可能用到的最大栈 空间,来安排栈的大小,防止入栈的 数据太多而导致的超界; 执行出栈操作的时候也要注意,以防 栈空的时候继续出栈而导致的超界。
《汇编语言》第三章 课件01
![《汇编语言》第三章 课件01](https://img.taocdn.com/s3/m/f4ec546d783e0912a2162aca.png)
从哪个内存单元送到哪个寄存器中呢?
mov指令的格式: mov 寄存器名,内存单元地址 “[„]”表示一个内存单元, “[„]”中的0 表示内存单元的偏移地址。 那么内存单元的段地址是多少呢?
更多精彩资编程源请关注:
3.2 DS和[address]
执行指令时,8086CPU自动取DS中的数据为内 存单元的段地址。 如何用mov指令从10000H中读取数据? 10000H表示为1000:0(段地址:偏移地址) 将段地址1000H放入ds 用mov al,[0]完成传送(mov指令中的[]说 明操作对象是一个内存单元,[]中的0说明 这个内存单元的偏移地址是0,它的段地址 默认放在ds中) 如何把1000H送入ds?
内存中字的存储 DS和[address] 字的传送 mov、add、sub指令 数据段 栈 CPU提供的栈机制 栈顶超界的问题 push、pop指令 栈段
CPU 如何执行 指令的角度讲解了8086CPU的逻辑结构、 形成物理地址的方法、相关的寄存器以 及一些指令。 这一章中,我们从访问内存的角度继续 学习几个寄存器。
(一种合理的回
更多精彩资编程源请关注:
3.3 字的传送
因为8086CPU是16位结构,有16根数据线,所 以,可以一次性传送16位的数据,也就是一 次性传送一个字。 比如:
更多精彩资编程源请关注:
3.3 字的传送
问题3.3:内存中的情况如下图,写出下面 指令执行后寄存器ax,bx,cx中的值。
更多精彩资编程源请关注:
3.2 DS和[address]
CPU要读取一个内存单元的时候,必须先 给出这个内存单元的地址; 在8086PC中,内存地址由段地址和偏移 地址组成。 8086CPU中有一个 DS寄存器,通常用来 存放要访问的数据的段地址。
计算机组成原理与汇编语言3
![计算机组成原理与汇编语言3](https://img.taocdn.com/s3/m/7b7fc6d4b14e852458fb57ab.png)
补码加减运算
注意:求一个数的补码: 正数时,补码和原码相同; 负数时, 对原码除符号位外求反加1。
例1: 1: y = -0.0110 [y]补 = 1.1010 例2: y = 0.0111 [y]补 = 0.0111 [-y]补 = 1.1001 [-y]补 = 0.0110
第三章 数值运算及运算器
例(3):按位清
设:A=10010010,将A最高位清“0” 设:B=01111111 10010010 A ∧ 01111111 B ——————— 00010010 A
第三章 数值运算及运算器
例(4):按位测试
设:A=10010010,测A最高位是否为“1”; 设: B=10000000 10010010 ∧ 10000000 ——————— 10000000 结果不全为“0”,表明被测码的被测位为“1”。 结果为全“0”,表明被测码的被测位为“0”。
第三章 数值运算及运算器
(一)对进位公式的分析 设相加的两个n位操作数为: A=An-1An-2…Ai..A0 B=Bn-1Bn-2…Bi..B0
Ci+1 = AiBi + (Ai⊕Bi) Ci —— 进位逻辑表达式 设:Gi = AiBi —— 进位产生函数(Carry Generate Function)
二、溢出检测
1. 采用一个符号位判断
规则: • 当两个同号数相加,若所得结果符号与两数符号不同, 则表明溢出。 • 设An、Bn分别表示两个操作数的符号; Sn表示结果 的符号, 则有: 溢出=AnBnSn + AnBnSn
63+66=129 0,0111111 + 0,1000010 1,0000001
《汇编语言》第三章 课件03
![《汇编语言》第三章 课件03](https://img.taocdn.com/s3/m/5ad3fd701711cc7931b716ca.png)
3.4 mov、add、sub指令
根据已知指令进行推测:
mov 段寄存器,寄存器 mov 寄存器,段寄存器 (验证) mov 内存单元,寄存器 mov 内存单元,段寄存器 mov 段寄存器验证(Debug)
mov
段寄存器,寄存器 mov 寄存器,段寄存
器
更多精彩资编程源请关注:
3.4 mov、add、sub指令
add和sub指令同mov一样,都有两个操作对象。
它们可以对段寄存器进行操作吗? (请自行在Debug中试验)
更多精彩资编程源请关注:
3.5 数据段
前面讲过,对于8086PC机,我们可以根据需要将一组 内存单元定义为一个段(可以是代码段、数据段等)。 我们可以将一组长度为N(N≤64K)、地址连续、起始 地址为16的倍数的内存单元当作专门存储数据的内存 空间,从而定义了一个数据段。
更多精彩资编程源请关注:
问题3.5分析
注意:一个字型数据占两个单元,所以偏移 地址是0、2、4。
更多精彩资编程源请关注:
3.1节~3.5节 小结
(1)字在内存中存储时 ,要用两个地址连续 的内存单元来存放,字的低位字节存放在低地 址单元中,高位字节存放再高地址单元中。
(5)mov、add、sub是具有两个操作对象的指 令。jmp是具有一个操作对象的指令。 (6)可以根据自己的推测,在Debug中实验指 令的新格式。
更多精彩资编程源请关注:
检测点3.1 (p52)
没有通过检测点请不要向下学习!
更多精彩资编程源请关注:
3.5 数据段
我们将123B0H~123BAH的内存单元定义 为数据段,我们现在要累加这个数据段 中的前3个单元中的数据,代码如下:
汇编语言课后答案第3章
![汇编语言课后答案第3章](https://img.taocdn.com/s3/m/f499cd3e640e52ea551810a6f524ccbff121caab.png)
汇编语言课后答案第3章第3章习题3.1 填空题(1)汇编语言指令由两部分组成:___操作码__________表示指令的操作内容,_____操作数________表示指令在执行过程中所用到的数据信息。
(2)在16位CPU的寄存器间接寻址方式中,若用__SI_____、__DI______、__BX______作为间接寻址的寄存器,则操作数在____DS___段中;若用___BP____作为间接寻址的寄存器,则操作数在___SS_____段中。
(3)在16位CPU的基址变址寻址方式中,基址寄存器可以为__BX_____或__BP______,变址寄存器可以为___SI____或___DI_____,若用__BX_____作为基址寄存器,则操作数在____数据段___段中;若用___BP____作为基址寄存器,则操作数在__堆栈______段中。
(4)设AX=2000H,BX=2300H,则在执行了指令CMP AX,BX后,标志CF=__1_______、ZF=____0____。
(5)当执行指令DIV BL后,被除数在_AX_______中,所得商在_______AL__中,余数在_____AH___中。
3.2 选择题1.若栈顶的物理地址为12000H,当执行完指令PUSH BX后,栈顶的物理地址为(D)A. 12001HB. 12002HC. 11FFFHD. 11FFEH2.在程序运行过程中,确定下一条指令的物理地址的计算表达式是(B)A. DS×16+SIB. CS×16+IPC. SS×16+SPD. ES×16+DI3.下面指令执行后,将改变寄存器AX内容的指令是(B)A. OR AX,AXB. AND AX,BXC. TEST AX,01HD.CMP AX,14.设AH=79H,当执行指令ADD AH,98H后,标志位CF和0F 的值分别为(D )A. 0,0B. 0,1C. 1,0D. 1,15.设AL=0A0H,要使结果AL=50H,应执行的指令是( D)A. AND AL,0F0HB. NOT ALC. OR AL,0F0HD. XOR AL,0F0H6.设AH=68H,当执行指令SUB AH,72H后,标志位CF和SF 的值分别为(D )A. 0,0B. 0,1C. 1,0D. 1,17.要使寄存器AL的最低位置1,应使用下面的指令( C )A. AND AL,01HB. XOR AL,01HC. OR AL,01HD. NOT AL8.要使BL寄存器的最高位清0,应使用下面的指令(D)A. AND BL,80HB. OR AL,7FHC. OR BL,80HD. AND BL,7FH9. 将寄存器AX的内容乘以2的正确指令序列是( A )A. SHL AX,1B. SHR AX,1C. ROL AX,1D. RCR AX,110.下列指令执行后,寄存器AL中的内容为(C)MOV AL,90HADD AL,ALADC AL,ALA. 20HB. 240HC. 41HD. 241H3.3 说明下列指令中源操作数的寻址方式。
汇编语言程序设计第三章习题答案
![汇编语言程序设计第三章习题答案](https://img.taocdn.com/s3/m/196efe83d0d233d4b04e6900.png)
第三章答案:3.1(1)立即数寻址代码段(2)寄存器寻址数据段(3)寄存器间址数据段(4)寄存器间址数据段(5)直接寻址数据段(6)直接寻址数据段(7)基址寻址堆栈段(8)直接寻址代码段(9)寄存器寻址数据段(10)变址寻址数据段(11)基址变址寻址数据段(12)基址变址寻址堆栈段(13)基址变址寻址堆栈段(14)基址变址寻址堆栈段3.2(1)直接寻址30000H+0ABCH=30ABCH(2)寄存器寻址(3)直接寻址30000H+2000H=32000H(4)基址寻址30000H+0100H+2000H=32100H(5)寄存器间址30000H+0100H=30100H(6)寄存器间址30000H+00A0H=300A0H(7)寄存器间址20000+0010H=20010H(8)基址变址寻址20000H+0010H+2000H+00A0H=220B0H (9)基址寻址30000H+0100H-40H=300C0H(10)变址寻址30000H+0040H+00A0H=300E0H(11)基址变址寻址30000H+0100H+0100H-0040H=301C0H (12)基址变址寻址20000H+00A0H+0100H+0010H=201B0H (13)变址寻址30000H+2000H+0002H=32002H(14)基址变址寻址41000H+2000H+0100H+0002H=43102H 3.3第一种:MOV AX,[02C0H]第二种:MOV AX,[BP]第三种:MOV AX,0240H[BX]第四种:MOV AX,0100H[DI]第五种:MOV AX,0220H[SI](只要物理地址为095C0H即可)3.4(1)错,类型不匹配(2)错,类型二义性(3)对(4)错,立即数不能直接送入段寄存器(5)错,字节单元无法存放PUSH的值(6)对(7)对(8)错,不能把数据从段寄存器传入段寄存器(9)错,源操作数与目的操作数不能同时为存储器操作数(10)错,操作数类型二义性(11)错,XCHG指令的两个操作数都不能为立即数(12)错,类型不匹配(13)错,操作数类型二义性(14)错,RCL移位不为1时,必须用CL寄存器来操作(15)错,不能传送入段寄存器CS(16)错,目的操作数不能为立即数(17)错,格式不正确(18)错,变址寄存器不能使用寄存器BP(19)错,基址寄存器不能使用寄存器SI(20)错,目的操作数必须为通用寄存器3.5(1)(CL)=0F6H(2)(1E4F6)=5678H(3)(BX)=0056H (AX)=1E40H(4)(SI)=00F6H (DS)=1E40H (1E4F6H)=0024H (5)(CX)=00F6H (AX)=5678H (09226H)=1234H 3.6MOV是数据传送指令,LEA是取地址指令。
汇编语言 第三章 实方式指令寻址与指令系统
![汇编语言 第三章 实方式指令寻址与指令系统](https://img.taocdn.com/s3/m/f5ee262d482fb4daa58d4bc7.png)
3.2实方式32位指令寻址
实地址方式32位指令寻址,指在32位的PC机上使
用16位的存储机制,执行32位的非保护方式及非虚拟
方式的指令,达到直接存取32位寄存器和32位存储器
操作数的目的。
3.3实方式指令系统
指令系统是一台机器所有指令的集合。 Pentium系列 机指令系统庞大、类型多样,约有300多条指令,其中包 括基本指令100多条。 具有支持多进程、多任务、虚 拟存储器和多媒体等功能的32位指令。
设DS=4000H, 1、MOV AX,[3020H] 2、VAR DW 86
MOV AX,VAR 3、SI=1800H, MOV AX,[SI] 4、COUNT DW 5,6,7,8 SI=06H MOV AX,COUNT[SI]
3.1.3数据寻址与数据结构的 关系
多种寻址方式能方便、灵活的存取操作数, 支持高级语 言的某些数据结构。
寄存器间接寻址例
例:MOV AX,[BX] 设BX=1200H
代
MOV
码
段
偏移地址
┇
1200H 22H
数
AH AL 11 22
11H
据
段
寄存器间接寻址
由寄存器间接给出操作数的偏移地址;
存放偏移地址的寄存器称为间址寄存器,它们是:BX, BP,SI,DI
操作数的段地址(数据处于哪个段)取决于选择哪一 个间址寄存器:
一、立即寻址
指令中的源操作数是立即数,即源操作数是参加操作 的数据本身
例:MOV AX,1200H
AH AL
MOV
00H
代
12H
码
┇
段
寄存器寻址(Register Addressing)
汇编语言程序设计(第二版)第3章
![汇编语言程序设计(第二版)第3章](https://img.taocdn.com/s3/m/d10b688b4128915f804d2b160b4e767f5acf802a.png)
汇编语言在系统编程、嵌入式 系统、操作系统开发等领域具 有广泛应用。
汇编语言的应用领域
系统软件
操作系统、编译器等核心组件通常使用汇编语言 编写。
游戏开发
游戏引擎和某些性能敏感的部分可能会使用汇编 语言以提高性能。
嵌入式系统
对于资源有限的微控制器和特定硬件设备,汇编 语言是实现高效控制的理想选择。
本章学习目标
THANKS
感谢观看
汇编语言调用C语言程序
嵌入C语言代码
01
在汇编语言程序中,可以直接嵌入C语言代码,通过编译器将其
编译成目标代码。
调用C语言函数
02
汇编语言程序可以直接调用C语言函数,通过函数指针或内联汇
编实现。
数据共享
03
汇编语言程序和C语言程序之间可以通过全局变量或内存映射的
方式实现数据共享。
汇编语言与C语言的混合编程实例
顺序程序设计是程序中最基本的结构之一,它构成了程序的基本框架。 在顺序程序中,程序按照指令的顺序执行,每条指令完成一个特定的操 作,从而实现了程序的逻辑功能。
顺序程序设计需要注意指令的执序的效率和可读性,尽量减少不必要 的操作和重复计算。
01
掌握汇编语言的语法和指令集。
02
理解汇编语言程序的结构和流程控制。
03
学习如何使用汇编语言进行系统调用和底层编程。
02
汇编语言基础
汇编语言的指令系统
指令系统概述
指令系统是计算机硬件能够理解和执 行的基本命令集合,是汇编语言的基 础。
01
02
数据传输指令
用于在寄存器、内存和输入/输出设备 之间传输数据,如MOV指令。
分支程序设计
分支程序设计是指根据条件判断结果选择不同的执行路径的过程。在汇编语言中,分支程序设计通常 使用跳转指令实现程序的流程控制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Chap3 Elements of Assembly Language 10
Exercises 3.1
For each combination of characters below, determine whether or not it is an allowable label (name). If not, give a reason (a) repeat (e) 2much
Chap3 Elements of Assembly Language 24
Run example Debug Windbg example.exe
Chap3 Elements of Assembly Language
25
3.4 汇编器清单文件(.lst)
ML汇编器在汇编过程中会产生一个清 单文件.lst,这个文件显示源代码、转 换的目标代码以及附近信息. 汇编时需 要二维复交转换器 /Fl, 生产清单文件 ml /c /coff / Fl /Zi example.asm
Edit Masm
6.11
Windbg
cmd
Chap3 Elements of Assembly Language 23
DOS prompt
Assemble
ml /c /coff /Zi example.asm /c 只编译不连接 /coff 生成COFF格式的目标文件 /Zi 告诉汇编器在输出时添加调试信息
是一条指令性语句,mov代表“move”, 但是该指令实际上是完成一个复制操作。 mov number1, eax 指令把寄存器中的数值复制到地址为 number1的内存双字中。
Add
将第二个数字加到第一个数字上。 add eax,number2
Chap3 Elements of Assembly Language 20
example.lst
Chap3 Elements of Assembly Language
26
3.5 常数操作数
数据的表示方式 BYTE directive WORD directive DWORD directive
Chap3 Elements of Assembly Language
(b) exit
(c) more
(f) add
(g) if
(d) EndIf
(h) add2
Chap3 Elements of Assembly Language
11
汇编语言的格式
[名字] 指令助记符 [操作数] [;注解]
2.指令助记符:表示不同操作的指令 3.操作数: 指令执行的对象。依指令的 要求,可能有一个、两个或者没有。 4.注解:该项可有可无,是为源程序所 加的注解,用于提高程序的可读性。 ZeroCount:mov eax,0 ;初始化数据 为0
是一个指示性语句。Proto用来产生一个函数, 函数名字是:ExitProcess,用于结束程序的系 统函数。它有一个参数Dword类型的。
Chap3 Elements of Assembly Language
16
Directives (2)
Include io.h
指示汇编器拷贝一文件io.h到程序中
3
3.1 汇编语言
一个汇编语言的源代码文件包含了一 系列语句。
语句要求每行少于80个字符。(MASM6.1
还允许不长于512个字符的句子,在每行的行尾用 斜杠“\”将一条语句拆分成多行)。
注释语句,开头用“;”。 Mov eax,0 ;初始化数据为0 不区分大小写
Chap3 Elements of Assembly Language
Chap3 Elements of Assembly Language
12
3.2一个完整的实例
从键盘输入两个数据,得到两个数据 的和,显示出来。
Chap3 Elements of Assembly Language
13
C program
#include <stdio.h> main() { long a,b,c; printf("Enter first number: "); scanf("%ld",&a); printf("\nEnter second number: "); scanf("%ld",&b); c=a+b; printf("\n\nThe sum is %ld \n",c); }
27
数据的表示方式
Suffix
H B O or Q none
Base
16 2 8 10
Number System
hexadecimal binary octal decimal
Chap3 Elements of Assembly Language
28
Example of the use of suffixes
将双字整数转换为ASCII码
Chap3 Elements of Assembly Language 21
3.3程序的汇编、链接和运行
汇编语言的过程
Object file (Machine code, .obj) List file (Text file, .lst)
Linker (link)
Assembler Source file (masm) (Text file .asm)
Chap3 Elements of Assembly Language 6
指示性语言(directive)
一条指示性语句告诉汇编器做某种操 作。这种操作并不会产生机器指令, 也不会对目标代码有任何影响。 .code
. 386
.nolist Include io.h
Chap3 Elements of Assembly Language
; valueis FF ; valueis A5
Chap3 Elements of Assembly Language 15
Directives(1)
.386
指明指令集
.model flat
程序工作模式, flat为Windows程序使用的模式 (代码和数据使用同一个4GB段)
ExitProcess
proto near32 stdcall , dwExitCode:dword
29
BYTE directive
一条Byte指示性语句为数据与预留了 一个或多个字节的存储空间。如果数 据是数字的,那么可以被看作为有符 号数据或者无符号数。 无符号数据的表示范围0 to 255 有符号数据的表示 –128 to 127
Chap3 Elements of Assembly Language
Link
link /debug /subsystem:console /entry:start /out:example.exe example.obj io.obj kernel32.lib /subsystem:console 连接器的参数,用来指定程序 的入口函数,console是win32 字符模式应用程序
汇编语言的要素
上章回顾
Hardware
Memory & memory address CPU registers
Chap3 Elements of Assembly Language
2
本章内容
汇编语言
程序的汇编、链接和运行
指令中的操作数
I/O.H中宏的输入/输出
Chap3 Elements of Assembly Language
Executable file (Machine code, .exe)
Debuger (windbg)
Text editor (edit)
Chap3 Elements of Assembly Language
22
需要的软件
Text
Editors Assembler Linker Debuger
7
宏(macro)
一个宏语句是一系列语句的缩写,它 们可以是指令性语句、指示性语句或 者宏。
Chap3 Elements of Assembly Language
8
汇编语言的格式
由汇编语言编写的源程序是由许多语句(也 可称为汇编指令)组成的。每个语句由1~4 个部分组成,其格式是: [名字] 指令助记符 [操作数] [;注解]
1.
名字:给指令或某一存储单元地址所起的名字。可由下列 字符组成: 字母:A ~ z ; 数字:0 ~ 9 ; 特殊字符:?、· 、@、 __、$ 。 数字不能作标识符的第一个字符,而圆点不能用作第一个 字符。标识符最长为247个字符。
9
名字域的用处之一是在程序汇编和链 接后,代表指令在内存中的地址。其 他的指令就可以很容易地找到这个被 标识的指令,如果一条加法指令需要 在程序中循环执行,那么就可以这样 写: addloop: add eax,158 Jmp addloop Jmp是跳转指令。
30
Example of byte
byte1 BYTE 255 ; valueis FF
byte2 BYTE 127 ; valueis 7F byte3 BYTE 91 ; valueis 5B
byte4 BYTE 0
byte5 BYTE -1 byte6 BYTE -91
; valueis 00
Macros
Output
显示存储在prompt1地址中的字符串,使用空字 符串(00)字节来结束显示