第三章 汇编语言程序设计
汇编语言程序设计(第四版)第3章【课后答案】
汇编语言程序设计第四版【课后习题答案】--囮裑為檤第3章汇编语言程序格式〔习题3.1〕伪指令语句与硬指令语句的本质区别是什么?伪指令有什么主要作用?〔解答〕伪指令语句与硬指令语句的本质区别是能不能产生CPU动作;伪指令的作用是完成对如存储模式、主存变量、子程序、宏及段定义等很多不产生CPU动作的说明,并在程序执行前由汇编程序完成处理。
〔习题3.2〕什么是标识符,汇编程序中标识符怎样组成?〔解答〕为了某种需要,每种程序语言都规定了在程序里如何描述名字,程序语言的名字通常被称为标识符;汇编语言中的标识符一般最多由31个字母、数字及规定的特殊符号(如-,$,?,@)组成,不能以数字开头。
〔习题3.3〕什么是保留字,汇编语言的保留字有哪些类型,并举例说明。
〔解答保留字是在每种语言中规定了有特殊意义和功能的不允许再做其它用处的字符串;汇编语言的保留字主要有硬指令助记、伪指令助记符、运算符、寄存器名以及预定义符号等。
汇编语言对大小写不敏感。
如定义字节数和字符串的DB就是伪指令助记符。
〔习题3.4〕汇编语句有哪两种,每个语句由哪4个部分组成?〔解答〕汇编语句有执行性语句和说明性语句;执行性语句由标号、硬指令助记符、操作数和注释四部分组成;说明性语句由名字、伪指令助记符、参数和注释四部分组成〔习题3.5〕汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。
〔解答〕⒈编辑文本编辑程序汇编语言源程序.asm⒉汇编汇编程序目标模块文件.obj⒊连接连接程序可执行文件.exe或.com⒋调试调试程序应用程序〔习题3.6〕区分下列概念:(1)变量和标号(2)数值表达式和地址表达式(3)符号常量和字符串常量〔解答〕(1)变量是在程序运行过程中,其值可以被改变的量;标号是由用户自定义的标识符,指向存储单元,表示其存储内容的逻辑地址。
(2)数值表达式一般是由运算符连接的各种常数所构成的表达式,地址表达式是由名字、标号以及利用各种的操作符形成的表达式。
第3章汇编程序设计PPT教学课件
BIGE _THING DD ?;定义一个双字
+1 43H
BIG _ THING
56H
变量就代表低字节的 单元地址
2020/12/10
思考: MOV THING,13 的操作数寻址方式
14
定义数据表:
POWERS DB 1,2,4,8,16
ALL DB 0,0,0,0
ALL DB 4DUP(0)
类型 PTR 表达式 TW DW 23 MOV AL,BYTE PTR TW THIS:类型在THIS中指定,段地址和段内偏移量就是汇 编时的当前值。 EQU THIS 类型 MYDATA SEGMENT BB EQU THIS WORD BUFF DB 100 DUP(0) MYDATA ENDS
3.标号:某条指令所存放存储单元的符号地址,它 是转移指令或调用指令的目标操作数,属性 包 括 段值、偏移量和类型(NEAR,FAR)。
2020/12/10
NEAR—转移指令或调用指令与此标号所指的语句 或过程在同一段内,所以只需要改变IP。
FAR—转移指令或调用指令与此标号所指的语句 或过程不在同一段内,所以不但需要改变IP, 还要改变CS。
2020/12/10
11
3.3指示性语句
符号定义语句 数据定义语句 段定义语句 过程定义语句 结束语句
2020/12/10
12
3.3.1符号定义语句
1. 等值语句 EQU
符号名 EQU 表达式或常量或符号名
COUNT EQU CX
EQU语句在未解除前,不能重新定义
2. 等号语句 = 能对符号进行再定义。
第3章 汇编语言程序设计
3.1汇编语言的格式
3.2语句行的构成
汇编第3章-汇编语言程序设计
另外还要按被调用的功能的要求在指
定的寄存器中放一定的数据,称为入 口参数,使用不同的功能需要不同的 入口参数。 如果操作有需要交给用户程序的数据, 将放在特定的寄存器或内存中,称为 出口参数。调用完成后,用户程序可 以从那些特定的寄存器或内存中取出 数据使用,或者判断操作完成的情况。
1.DOS的1号子功能——单字符输入
(6)
MUL (7) MUL (8) MUL (9) MUL
⑽
BYTE PTR [BP+DI];正确 DS ;错误 1024H ;错误 [BX] ;错误
MUL AX, BX ;错误
5.
DIV指令 【指令格式】DIV S 【功能】完成无符号数的除法运算。 根据S的类型分两种情况:如果S是字 节型,则用AX的值作为被除数,S作为 除数,运算结果:字节型的商放到AL 中,字节型的余数放到AH中;如果S是 字型,则DX、AX组成32位的被除数,S 作为除数,计算结果:字型的商放到 AX中,字型的余数放到DX中。
【功能】从键盘上读取一个按键的
ASCII码值。 【具体操作】: (1) AH中放子功能号1; (2) [入口参数] 无; (3) INT 21H 软中断调用 (4) [出口参数] AL中是按键的ASCII 码值。
[说明]
该功能只要求在执行INT
21H指令时AH 中的值是1,而不论AH是在何时、以何 种指令被赋的值,这一点对所有DOS系 统功能调用都是一样的。 调用时,计算机的屏幕上将出现一个 闪烁的光标,等待操作人员按键;当 有键被按下后,取出该按键的ASCII值 放入AL。
表3-1 特殊输出效果相应的ASCII码值
【例3-6】
编写程序段完成回车换
第3章-汇编程序设计PPT课件
A<=5?
Y
N
(A-5)*2+R2 R2
R2 (41H)
结束
;存运费 M
-
18
3.4.2 多分支程序(散转程序)
有一类分支程序,它根据不同的输入条件或不同的运算 结果,转向不同的处理程序,称转程序的设计
这类程序通常利用JMP @A+DPTR间接转移指令实现转移。 有如下两种设计方法: 1. 查转移地址表:
GH+2 56 78
GH+4 00 08
8
4.保留字节 标号:DS (数值表达式)
作用: 指示在程序存储器中保留以标号为起始地址的若干字 节单元,其单元个数由数值表达式指定。
例如 L1:DS 32 ; 从L1地址开始保留32个存储单元。
5. 等值指令 标号 EQU(数值表达式)
表示EQU两边的量等值,用于为标号或标识符赋值。
例如: X1
EQU 2000H
X2
EQU 0FH
…
MAIN:
MOV DPTR,#X1 ; DPTR=2000H
ADD A,#X2 ; A=A+0FH
-
9
6. 位定义 标号 BIT [位地址] 作用: 同EQU指令,不过定义的是位操作地址。 例如 AIC BIT P1.1。
7. 汇编结束 END 作用: 指示源程序段结束。
MOV DPL,A
MOV DPH,B
;DPTR为表中地址
CLR A
;A=0
JMP @A+DPTR ;转移
TAB:DW PR0,PR1,PR2,…..,PRn ;转移地址表
END
-
TAB 01 10
TAB+2 02 20 ..
汇编语言程序设计(第二版)第3章
整理ppt
7
第3章 基本指令与简单程序设计 3.1.3 内存型寻址方式
内存型寻址方式是指参与操作的数据在内存中,因此必须
指明操作数究竟在内存的什么地方,即指出内存的逻辑地址。
逻辑地址的段地址部分来自某个段寄存器。每一个内存型操作
数都有一个不需要在指令中写出的缺省段寄存器与之对应,如
果就以这个缺省段寄存器的值作为段地址,则指令中只要确定
1CF0D
1234 DS
图3.1 直接寻址方式下操作数的物理地址的形成
整理ppt
11
第3章 基本指令与简单程序设计
直接寻址方式可以使用段跨越。下面是两个使用段跨越的例子:
MOV AL,CS:[buf] MOV AL,ES:[buf] 使用段跨越时物理地址的形成方式,只要在图3.1中把段寄存器 DS换成段跨越符号所指明的段寄存器即可。
假定上述指令中变量buf的缺省段寄存器是DS,执行上述 指令时DS的值是1234H,buf的偏移地址是0ABCDH,则物理 地址的形成可用图3.1表示,图中数据均为十六进制。
整理ppt
10
第3章 基本指令与简单程序设计
MOV AL,[buf] ABCD
地址加法器进行计算 物理地址
1234×10+ABCD
第3章 基本指令与简单程序设计
第3章 基本指令与简单程序设计
3.1 寻址方式 3.2 基本指令 3.3 单个字符的输入输出 3.4 源程序的基本格式 3.5 顺序程序设计 习题三
整理ppt
1
第3章 基本指令与简单程序设计
3.1 寻 址 方 式
3.1.1 立即数型寻址方式
这种寻址方式又称为立即数或立即寻址,是直接把参与操 作的数据写在指令中。用汇编语言书写时,操作数可以是各种 数制下的数值,也可以是带单引号的字符。比如,下面的 MOV指令中源操作数都是立即寻址的简单情况。汇编语言要 求指令在一行写完,指令后面所带的分号表示该行的后续内容 是注释。
第三章汇编语言程序第三章-汇编语言程序设计设计
;STR1定义为字类型
MOV AX,STR1 ;合法
MOV AL,STR1 ;非法
MOV指令
由汇编程序执行的指令,它本身不被汇编 成机器指令。常用的伪指令有:
数据定义伪指令 符号定义伪指令 段定义和段寄存器指定伪指令 过程定义伪指令 结束伪指令
3.2.1 数据定义伪指令
00H 008BH
8FH 008CH
00H 008DH
3.2.2 符号定义伪指令
把一个表达式用一个符号表示,以后凡出 现该表达式的地方都可用这个符号表示。类 似于C语言中的#define。 符号定义伪指令有两种:EQU,=
✓ 用EQU定义的符号未清除前,不能重新定 义。清除EQU定义可用PURGE伪指令。
start: MOV AX, data
MOV DS, AX MOV ES, AX
<此处加入你自己的程序段>
MOV AL, 4CH INT 21H
code ENDS END start
堆栈段 数据段
代码段
3.1.2 汇编语言的语句与格式
汇编语言的语句有两种:
指令性语句——由8086指令助记符构成的语句 指示性语句——由伪指令构成的语句
助记符——用便于记忆的英语单词表示的指 令操作码。它反映了指令的功能和主要特征,便 于人们理解和记忆。
指令除了操作码以外,还有一个操作数问题。
操作数可能放在存储器中,这就涉及操作数的 地址。程序中遇到转移指令或调用指令,也需要 知道转移地址,若采用具体地址就很不方便,一 旦有错,改动也很麻烦。于是人们采用标号或 符号来代替地址,例:
4.表达式
➢表达式是常数、寄存器、标号、变量与 运算符的组合。
➢有数字表达式和地址表达式两种。
第三章汇编语言及程序设计
4、 运算符和伪操作符
1) 运算符有算术运算符、逻辑运算符、关系 运算符
算术运算符包括+、-、*、/、MOD、SHL(左移 一位相当于乘2)、SHR(右移1位相当于除2) 例:数组ARRAY定义如下
ARRAY DB 1,2,3,4,5,6,7,8
TRY
DB 20
MOV AX,30*5
MOV CX,(TRY-ARRAY)
. THIS操作符 格式:变量/标号 EQU THIS 类型/距离
功能:将EQU THIS右边的类型/距离属 性,赋给左边的变量/标号,该变 量或标号的段地址和偏移地址与 下一存储单元的地址相同
如:FIRST EQU THIS BYTE TABLE DW 200 DUP(?)
. SHORT操作符
例:要求把3个16位的数相加,其和仍为16位数。 NAME ADDHEX STACK SEGMENT STAPN DB 200 DUP (0);此处输入堆栈段代码 TOP EQU LENGTH STAPN STACK ENDS DATA SEGMENT NUM1 DW 1234H NUM2 DW 5678H NUM3 DW 0ABCDH ANS DW ? ;此处输入数据段代码 DATA ENDS CODE SEGMENT
例:
COUNT EQU 100
;常数值赋给符号名COUNT
DATA EQU COUNT+2 ;表达式值赋给符号名DATA
A1
EQU [BX+SI] ;变址寻址存储单元内容赋给符号名A1
B1
EQU OFFSET A1 ;偏移地址值赋给符号名B1
C1
EQU ADD
;加法指令赋给符号名C1
注:PURGE语句可以解除对某一个标号的赋值,使它在后面可以重新定 义。
指令系统及汇编语言程序设计
第3章指令系统及汇编语言程序设计一、简答题1、80C51系列单片机的指令系统有何特点?2、80C51单片机有哪几种寻址方式?各寻址方式所对应的寄存器或存储器空间如何?3、访问特殊功能寄存器SFR可以采用哪些寻址方式?4、访问内部RAM单元可以采用哪些寻址方式?5、访问外部RAM单元可以采用哪些寻址方式?6、访问外部程序存储器可以采用哪些寻址方式?7、为什么说布尔处理功能是80C51单片机的重要特点?8、对于80C52单片机内部RAM还存在高128字节,应采用何种方式访问?9、试根据指令编码表写出下列指令的机器码。
(1)MOV A,#88H(2)MOV R3,50H(3)MOV P1.1,#55H(4)ADD A,@R1(5)SETB 12H10、完成某种操作可以采用几条指令构成的指令序列实现,试写出完成以下每种操作的指令序列。
(1)将R0的内容传送到R1;(2)内部RAM单元60H的内容传送到寄存器R2;(3)外部RAM单元1000H的内容传送到内部RAM单元60H;(4)外部RAM单元1000H的内容传送到寄存器R2;(5)外部RAM单元1000H的内容传送到外部RAM单元2000H。
11、11、若(R1)=30H,(A)=40H,(30H)=60H,(40H)=08H。
试分析执行下列程序段后上述各单元内容的变化。
MOV A,@R1MOV @R1,40HMOV 40H,AMOV R1,#7FH12、若(A)=E8H,(R0)=40H,(R1)=20H,(R4)=3AH,(40H)=2CH,(20)=0FH,试写出下列各指令独立执行后有关寄存器和存储单元的内容?若该指令影响标志位,试指出CY、AC、和OV的值。
(1)MOV A,@R0(2)ANL 40H,#0FH(3)ADD A,R4(4)SWAP A(5)DEC @R1(6)XCHD A,@R113、若(50H)=40H,试写出执行以下程序段后累加器A、寄存器R0及内部RAM的40H、41H、42H单元中的内容各为多少?MOV A,50HMOV R0,AMOV A,#00HMOV @R0,AMOV A,3BHMOV 41H,AMOV 42H,41H14、试用位操作指令实现下列逻辑操作。
第3章ARM汇编语言程序设计GNU汇编ppt课件
时将程序计数器PC指向子程序的入口点,当子程序执行完毕需要返回调用处时, 只需要将存放在LR中的返回地址重新复制给程序计数器PC即可。在调用子程序的 同时,也可以完成参数的传递和从子程序返回运算的结果,通常可以使用寄存器 R0~R3完成。 以下是使用BL指令调用子程序的汇编语言源程序的基本结构:
.string/.asciz/.ascii
语法格式 .string/.asciz/.ascii 表达式{,表达式}...
作用
.string/.asciz/.ascii定义多个字符串。 注意:ascii伪操作定义的字符串需要自动添加结尾字符'\0'
举例
.string "abcd","hello"
bne 1f @跳转到1标号去执行 局部标号代表它所在的地址,因此也可以当作变量或
者函数来使用。
Linux汇编程序中的分段
(1).section伪操作
用户可以通过.section伪操作来自定义一个段,格式如下 :
.section section_name [, "flags"[, %type[,flag_specif
地址表达式expr的取值范围如下:
当地址值是字节对齐时,其取指范围为−255B~255B;
当地址值是字对齐时,其取指范围为−1020B~1020B。
ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的 地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被 编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB 指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错 误,编译失败。
总复习第3章 汇编语言程序设计ppt课件
9
LE(小于等于) SEG
4)分析运算符 ①OFFSET运算符:利用运算符OFFSET可以得到一个标号或变 量的偏移量。 使用格式:OFFSET 变量名或标号名
②SEG运算符:利用运算符SEG可以得到一个标号或变量的 段基址 格式: SEG 变量名或标号名
10
③PTR运算符:用来指定存储器操作数的类型。 PTR的应用场合主要有两处:一种情况是当要访问的存储单元的 类型不确定时,可以用PTR明确指明要访问的存储单元的类型。如: MOV [BX],10H MOV BYTE PTR[BX],10H BX 10H
34
2. DOS软中断及系统功能调用
(2) DOS系统功能调用INT 21H
1. 设置功能号AH 2. 置入口参数 3. 执行INT 21H 4. 分析出口参数
注意:使用时保存好AH寄存器的内容
35
1)键盘输入(1号调用)
● 格式:
MOV AH,1 INT 21H
● 功能:等待从键盘输入一个字符→AL,同时将此字 符在屏幕上显示出来。 说明:系统执行该功能调用时将等待键盘输入,一旦按 键,就将其字符的ASCII码读入,首先检查是否是 〈CTRL〉+〈Break〉,若是,则从本调用的执行 中退出;否则,将ASCII码→AL,同时将该字符送显 示器显示。
汇编语言程序设计第三章习题答案
第三章答案: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是取地址指令。
汇编语言程序设计(第二版)第3章
汇编语言在系统编程、嵌入式 系统、操作系统开发等领域具 有广泛应用。
汇编语言的应用领域
系统软件
操作系统、编译器等核心组件通常使用汇编语言 编写。
游戏开发
游戏引擎和某些性能敏感的部分可能会使用汇编 语言以提高性能。
嵌入式系统
对于资源有限的微控制器和特定硬件设备,汇编 语言是实现高效控制的理想选择。
本章学习目标
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)。
Y=
1:;*****EXAM3.4***** 2:SSEG SEGMENT STACK 3: STK DB 50 DUP(0) 4:SSEG ENDS 5:DSEG SEGMENT 6: ARGX DB -5 7: RLT DB ? 8:DSEG ENDS 9:CSEG SEGMENT 10: ASSUME CS:CSEG,DS:DSEG 11: ASSUME SS:SSEG 12:BEGIN: MOV AX,DSEG 13: MOV DS,AX 14: MOV AX,SSEG 15: MOV SS,AX 16: MOV SP,SIZE STK 17: MOV AL,ARGX 18: AND AL,AL ;取标志符的值 19: JS ABSL ;SF=1,X<0 , 20: JZ MOVE ;ZF=1,X=0 ,
2. 操作符
操作符可以是指令助记符, 操作符可以是指令助记符 伪指令助记 宏指令符号。 符,宏指令符号。
3. 操作数
操作数是操作符操作的对象,可以是数 操作数是操作符操作的对象, 据本身,也可以是标号 也可以是标号、 据本身 也可以是标号、寄存器名或算术表达 式。
4. 注释
注释是对指令功能的说明, 注释是对指令功能的说明,目的是使自 己或他人在阅读分析程序时方便。 己或他人在阅读分析程序时方便。
21: 22: 23: 24: 25: 26: 27: 28: 29: 30:ONE: 31: 32:ABSL: 33:MOVE: 34: 35: 36:CSEG 37:
CMP JLE CMP JGE SAL SAL ADD SUB JMP ADD JMP NEG MOV MOV INT
AL,8 , ONE ;0<X<=8 AL , 15 MOVE ;X>=15 AL , 1 ;X×2 × AL , 1 ; X×2 × AL , ARGX ; AL← 5X AL , 2 MOVE AL , 10 MOVE 取负 AL ;对X取负 取负 RLT , AL AH , 4CH 21H ENDS END BEGIN
CSEG
SEGMENT ARGX DB 15 RLTY DW 0 ENDS SEGMENT ASSUME CS:CSEG,DS:DSEG MOV AX,DSEG MOV DS,AX MOV AL,5 MUL ARGX ADD AX,8 MOV RLTY,AX MOV AX,4C00H INT 21H ENDS END CALCU
20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
MOV AL,HEX LEA BX,HATAB AND AL,0FH , XLAT ;换码,将表中内容换到 中 换码,将表中内容换到AL中 MOV DL,AL ;显示 中内容 显示AL中内容 MOV AH,02 INT 21H MOV AX,4C00H INT 21H CSEG ENDS END HTOA
第三章 汇编语言程序设计
• 汇编语言源程序格式 • 顺序、分支、循环程序设计 顺序、分支、 • 子程序设计
§3.1 汇编语言的源程序格式
⑴汇编语言源程序由语句序列构成。 汇编语言源程序由语句序列构成。 ⑵源程序可以包含若干个代码段、数据段、 源程序可以包含若干个代码段、数据段、 附加段或堆栈段。 附加段或堆栈段。 ⑶段与段之间的顺序任意。 段与段之间的顺序任意。 ⑷独立运行的程序必须包含一个代码段,并 独立运行的程序必须包含一个代码段, 指示程序执行的起始点, 指示程序执行的起始点,一个程序只有一 个起始点。 个起始点。
单元中低4位十六进 例3.2 用查表的方法将 3. 用查表的方法将HEX单元中低 位十六进 单元中低 制数转换为对应的ASCII码,并显示出来。 码 并显示出来 并显示出来。 制数转换为对应的
十六进制 ASCII 十六进制 ASCII 十六进制 ASCII 十六进制 ASCII 0 1 2 3 30H 31H 32H 33H 4 5 6 7 34H 35H 36H 37H 8 9 A B 38H 39H 41H 42H C D E F 43H 44H 45H 46H
HATAB+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +0A +0B +0C +0D +0E +0F
30H 31H 32H 33H 34H 35H 36H 37H 38H 39H 41H 42H 43H 44H 45H 46H
HATAB DB ’012345678’ DB ’9ABCDEF’
§3.4 分支结构程序
(1) 分支结构程序的引出 (2)例题 (2)例题
分支结构程序的引出
用计算机处理问题过程中,总是要求计算 用计算机处理问题过程中 总是要求计算 机能做出各种逻辑判断,并根据判断的结果 并根据判断的结果,做 机能做出各种逻辑判断 并根据判断的结果 做 相应的处理。 相应的处理。 例如, 例如,火车站用计算机计算托运行李的托 运费,当旅客行李重量小于或等于 当旅客行李重量小于或等于20kg时,收 运费 当旅客行李重量小于或等于 时收 当行李重量超过20kg时,20kg以 费0.2元/kg,当行李重量超过 元 当行李重量超过 时 以 内部分0.2元 超出部分,收费 内部分 元/kg,超出部分 收费 元/kg。这 超出部分 收费0.3元 。 个处理过程,可归纳为下面数学表达式 可归纳为下面数学表达式: 个处理过程 可归纳为下面数学表达式 0.2*w (w≤20kg) P= 0.2*20+0.3*(w-20) (w>20kg)
例3.4 计算
X+10 (0<X≤8) Y= 5X-2 (8<X<15) 其它) |X| (其它 | 其它 为单字节带符号整数,且存于 单元, 设X为单字节带符号整数 且存于 为单字节带符号整数 且存于ARGX单元 单元 计算结果Y存入 存入RLT单元。 单元。 计算结果 存入 单元 X+10 5X-2 X -X (0<X≤8) (8<X<15) (X=0,X≥15) (X<0)
1: ;*****EXAM 3.2***** 2: SSEG SEGMENT STACK 3: STK DB 20H DUP (0) 4: SSEG ENDS 5: DSEG SEGMENT 6: HATAB DB 30H,31H,32H,33H,34H 7: DB 35H,36H,37H,38H,39H 8: DB 41H,42H,43H,44H,45H,46H 9: HEX DB 0CH 11: DSEG ENDS 12: CSEG SEGMENT 13: ASSUME CS:CSEG,DS:DSEG 14: ASSUME ES:DSEG,SS:SSEG 15: HTOA: MOV AX,DSEG 16: MOV DS,AX 17: MOV AX,SSEG 18: MOV SS,AX 19: MOV SP,SIZE STK ; SP←栈顶地址 栈顶地址20H
§3.3 顺序结构程序
计算 为无符号字节数据, 例3.1 计算Y=5X+8,设X为无符号字节数据 设 为无符号字节数据 且在ARGX单元存放。计算结果,存入 且在 单元存放。计算结果 存入 单元存放 RLTY单元。 单元。 单元
ARGX RLTY
15H 00H 00H
DSEG
DSEG CSEG CALCU:
{
例3.3 设内存中有三个互不相等的无符号字数 分别存放在ARG开始的字单元 编制 开始的字单元,编制 据,分别存放在 分别存放在 开始的字单元 程序将其中最大值存入MAX单元。 单元。 程序将其中最大值存入 单元 A 大 B C
大
1:;*****EXAM3.3***** 2:SSEG SEGMENT STACK 3: STK DB 20 DUP(0) 4:SSEG ENDS 5:DSEG SEGMENT 6: ARG DW 7138H,84A6H,29EH 7: MAX DW ? 8:DSEG ENDS 9:CSEG SEGMENT 10: ASSUME CS:CSEG,DS:DSEG 11: ASSUME SS:SSEG 12:FMAX:MOV AX,DSEG 13: MOV DS,AX 14: MOV AX,SSEG 15: MOV SS,AX 16: MOV SP,SIZE STK
3. 2 完整段定义格式
stack segment 定义堆栈段,段名stack ;定义堆栈段,段名 db 1024 dup(0) ;分配堆栈段的大小为 分配堆栈段的大小为1024字节 内容为 字节,内容为 字节 内容为0 stack ends ;堆栈段结束 data segment 定义数据段,段名data ;定义数据段,段名 ….. ;数据定义 data ends ;数据段结束 code segment 定义代码段,段名code ;定义代码段,段名 assume cs:code, ds:data, ss:stack ;确定各个逻辑段类型 确定各个逻辑段类型 start: mov ax, data ;程序起点 mov ds, ax 设置DS指向数据段的段地址 ;设置 指向数据段的段地址 ….. ;程序代码 mov ax, 4c00h int 21h ;程序结束,返回DOS 程序结束,返回 ….. ;子程序等的代码 code ends ;代码段结束 end start 汇编结束,程序起始点为start ;汇编结束,程序起始点为
17: LEA SI,ARG , 18: MOV AX , [SI] ] 19: MOV BX , [SI+2] ] 20: CMP AX ,BX 21: JAE FMAX1 22: MOV AX,BX , ,[SI+4] 23:FMAX1:CMP AX,[ ,[ ] 24: JAE FMAX2 25: MOV AX,[ ,[SI+4] ,[ ] 26:FMAX2:MOV MAX,AX , 27: MOV AH,4CH , 28: INT 21H 29:CSEG ENDS 30: END FMAX