汇编语言程序设计课件 第5讲 变量定义和存储器寻址
合集下载
第5章 汇编语言程序设计20PPT课件
第5章 汇编语言程序设计
第5章 汇编语言程序设计
5.1 汇编语言的基本概念
汇编语言是一种采用助记符表示的程序设计语言, 即用助记符来表示指令的操作码和操作数,用标 号或符号代表地址、常量或变量。
汇编语言编写的程序能够直接利用硬件系统的特 性直接对位、字节、字寄存器或存储单元、I/O端 口进行处理,同时也能直接使用CPU指令系统提供 的各种寻址方式。
(小于)、GT(大于)、LE(小于等于)、GE (大于等于) (4)分析运算符:SEG、OFFSET、TYPE、SIZE和 LENGTH (5)合成运算符:PTR、THIS、SHORT
5.3 伪指令语句
5.3.1 数据定义伪指令 5.3.2 符号定义伪指令 5.3.3 段定义伪指令 5.3.4 模块定义与连接伪指令 5.3.5 处理器选择伪指令
汇编程序时最早也是最成熟的一种系统软件。 汇编程序的功能如下:
用汇编语言编 写的源程序
汇编程序
目标程序
5.2汇编语言源程序的格式
5.2.1 分段结构 5.2.2 汇编语言语句的类型和格式
5.2.1 分段结构
汇编语言源程序的结构是分段结构形式,一个汇 编语言源程序由若干段(SEGMENT)组成,每个段 以SEGMENT语句开始,以ENDS语句结束。整个源 程序的结尾是END语句。
5.3.1 数据定义伪指令
数据定义伪指令的用途是定义一个变量的类型, 给操作数赋值,或者仅给变量分配存储单元而不 赋予特定的值
数据定义伪指令的一般格式为:
[变量名] 作数……]
伪指令定义符
操作数[,操
数据定义伪指令定义符后面的操作数可以是 常数、表达式或字符串,但每项操作数的值不能 超过由伪指令定义符所定义的数据类型限定的范 围。
第5章 汇编语言程序设计
5.1 汇编语言的基本概念
汇编语言是一种采用助记符表示的程序设计语言, 即用助记符来表示指令的操作码和操作数,用标 号或符号代表地址、常量或变量。
汇编语言编写的程序能够直接利用硬件系统的特 性直接对位、字节、字寄存器或存储单元、I/O端 口进行处理,同时也能直接使用CPU指令系统提供 的各种寻址方式。
(小于)、GT(大于)、LE(小于等于)、GE (大于等于) (4)分析运算符:SEG、OFFSET、TYPE、SIZE和 LENGTH (5)合成运算符:PTR、THIS、SHORT
5.3 伪指令语句
5.3.1 数据定义伪指令 5.3.2 符号定义伪指令 5.3.3 段定义伪指令 5.3.4 模块定义与连接伪指令 5.3.5 处理器选择伪指令
汇编程序时最早也是最成熟的一种系统软件。 汇编程序的功能如下:
用汇编语言编 写的源程序
汇编程序
目标程序
5.2汇编语言源程序的格式
5.2.1 分段结构 5.2.2 汇编语言语句的类型和格式
5.2.1 分段结构
汇编语言源程序的结构是分段结构形式,一个汇 编语言源程序由若干段(SEGMENT)组成,每个段 以SEGMENT语句开始,以ENDS语句结束。整个源 程序的结尾是END语句。
5.3.1 数据定义伪指令
数据定义伪指令的用途是定义一个变量的类型, 给操作数赋值,或者仅给变量分配存储单元而不 赋予特定的值
数据定义伪指令的一般格式为:
[变量名] 作数……]
伪指令定义符
操作数[,操
数据定义伪指令定义符后面的操作数可以是 常数、表达式或字符串,但每项操作数的值不能 超过由伪指令定义符所定义的数据类型限定的范 围。
第05章汇编语言及程序设计ppt课件
汇编语言 源程序
汇编
目标程序
汇编程序
一一对应
汇编语言的指令
机器语言的指令
汇编语言程序设计的特点:
➢ 汇编语言是面向机器的语言,CPU不同的机器有不同 的汇编语言
➢ 可以充分利用机器的硬件功能和结构特点
➢ 可有效地加快程序的执行速度,减少目标程序所占用 的存储空间
➢ 可以对输入/输出端口进行控制,实时性能好 ➢ 汇编语言程序移植性、通用性、可读性差
第 5 章 程序设计及汇编语言
内容安排
一. 程序设计步骤 二. 程序设计 三. 汇编语言及汇编程序 四. 汇编语言源程序格式及实例 五. 上机操作
§5.1 程序设计步骤
(1〕分析问题 (2〕建立数学模型 (3〕确定算法 (4〕绘制程序流程图 (5〕内存空间分配 (6〕编制程序与静态检查 (7〕程序调试〔实验)
[名字] DW <表达式或数据项表> 功能:表达式或项表中的每一项是一个/两个字
节数,他们从符号名地址开始按字节连续存放, 如:直D到1 表中DB数据12H项, 结12H束 12H
D1 DB 3 DUP (12H) MOV AX, D1
注意:① 表达式或数据项表多于一项时,项与项之间用 逗号“,”或空格分隔
MOV BL,0FFH ;将FFH送入BL寄存器
LOut: MOV AL,BL
OUT 73H,AL ;将结果的标志数据输出到 73H端口
HLT
;暂停
Lw10: MOV BL,00H
JMP LOut
L10to20: MOV BL,88H
JMP LOut
3. 循环程序
强制CPU重复执行某一指令系列〔程序段〕的一种程序 结构形式
组成:
汇编语言程序设计ppt课件
3.用注释行说明程序,便于阅读和修改调试和修改。
1
9
常用程序结构: 顺序程序、循环程序、分支程序、查表程序、子程
2. 顺序与循环程序设计
❖5.2.1 顺序程序设计(又称简单程序) 既无分支,又无循环,按照顺序执行 可完成一定的基本功能,是编写复杂程序的 基础
10
例1:将一个字节内的两个BCD码拆开并变成ASCII码, 存入两个RAM单元。BCD码放在内RAM的20H, 转换后高半字节放到21H,低字节放22H。
ROM
20H BCDH BCDL
SWAP A ORL A, #30H MOV 21H, A SJMP $
;BCDH数送A的低4位 21H 0011 BCDH ;完成转换 @R0 22H 000101 B0C0D0L0
;存数
END
12
回目录 上页 下页
5.2.2 循环程序
包含多次重复执行的程序段,循环结构使程序紧凑。
11
回目录 上页 下页
程序:
ORG 1000H
MOV R0, #22H ;R0 22H MOV @R0,#0 ; 22H 0 MOV A, 20H ;两个BCD数送A
A
B0C0D01H01 B0BCC0DD0LH0
XCHD A, @R0 ;BCDL数送22H ORL 22H, #30H ;完成转换
表示程序结构和程序功能
美国国家标准化协会ANSI(American National
Standard Institute)设定了一些常用的流程图符号如图所示:
开始
起止框
或
流程线
输入输出框 判断框
处理框
连接点 图:常用流程图符号
Y
?
第5章 汇编语言程序设计ppt课件
;段分配
START:MOV AX,DATA MOV DS,AX MOV AL,BUF1 ADD AL,BUF2 MOV SUM,AL MOV AH,4CH INT 21H
CODE ENDS END START
;填装数据段寄存器DS ;取第一个加数 ;和第二个加数相加
代 码 段
;返回DOS状态 ;CODE段结束 ;整个源程序结束
第5章 汇编语言程序设计
5.1 汇编语言程序格式 5.2 常用伪指令 5.3 汇编语言的编写 5.4 DOS功能调用 5.5 汇编语言设计
最新课件
教学重点
本章介绍程序结构、伪指令、DOS功能调用。 重点:汇编语言程序的基本结构;
伪指令及其使用方法; DOS功能调用; 基本的汇编语言程序设计方法。 难点:DOS功能调用的应用 汇编语言程序的设计
算术运算符
运 算
逻辑运算符
符
及 关系运算符
表
达 式
分析运算符
综合运算符
+、—、*、/、MOD
与数学运算符的意义相同。
A取N模D是、取OR余、数N。OT、XOR E例运Q:算、82结NEM果、O是LD一T、1个6G常;T数、结.L果E、为G2 E 两个2表0H达M式O比D较7时; ,结表果达为式4表示 方法/性质要相同 关时SSEI系Z,GE成为、、立全OT,YF0PF结SE果ET为、全LE1;NG不T成H、立 例把T规等偏H如存定价移IS:储存于地、指单储址MP令元OT单RV地M元OB址的XV分,性B解0X质;,为3段2地EQ址4和5
作用:由编程者按照一定的规则来定义的一种较“宏 大”的指令,包括多条指令或伪指令 。
最新课件
例题1
SEGMENT
ENDS
微机原理第五章汇编语言程序的设计课件
DB:定义字节变量,即其后的每个操作数均占1个字节; DW:定义字变量,即其后的每个操作数均占2个字节; DD:定义双字变量,即其后的每个操作数均占4个字节; DQ:定义4字变量,即其后的每个操作数均占8个字节; DT:定义10字节变量,即其后的每个操作数均占10个字节。 注意: 存放多字节数据时,数据高字节存放在高地址单元,低字 节存放在低地址单元。
汇编语句使用说明(续)
汇编语言中的常量与变量
常量:汇编中允许的常量有整数常量和字符串常量两种。 变量:汇编语言中的变量用来表示存放在内存中操作数,它 的值是可以改变的,变量的值就是操作数在内存中首字节的地 址,变量要事先定义才能使用。对于变量,类型属性说明变量在 内存中占多少个字节,其属性有BYTE(字节)、WORD(字)、 DOUBLE WORD(双字)3种。
☆ 变量定义伪指令
初值表给出变量的初始化值,有多个值时用逗号分隔。 初始化值可以是数值常数,也可以是表达式、?,还可以 由$、重复操作符DUP组成。其中: ?表示未赋初值; $ 表示将要分配的内存单元的偏移地址; DUP表示重复初值。 格式为:重复次数 DUP(重复参数) 说明:重复参数可以是多个,之间用逗号间隔。 举例:2 DUP(1,2) ;等价于1,2,1,2
☆ 常量--整数常量
字符串常量是由单引号或双引号括起来的单个字符或多个字符构成的。汇编程序把引号中的字符翻译成它的ASCII码值。如:‘A’(等于41H)、‘BC’(等于4243H)、“HELLO”等。
☆ 常量—字符串常量
汇编语言中的运算符与表达式
运算符:汇编中的运算符分为6大类,它们是:算术运算符、 移位运算符、逻辑运算符、关系运算符、分析运算符、合成运算 符(见课本P131表5-1)。 表达式:表达式是常数、寄存器、标号、变量与一些运算 符和操作码相组合的序列。 表达式的运算不由CPU完成,而是在程序汇编过程中进行 计算确定,并将表达式的结果作为操作数参与指令所规定的操 作。 当各种运算符同时出现在同一表达式中时,按照运算符的 优先级进行计算,对于优先级相同的运算符,按照从左到右的 顺序进行计算(见课本P132表5-2)。
汇编语句使用说明(续)
汇编语言中的常量与变量
常量:汇编中允许的常量有整数常量和字符串常量两种。 变量:汇编语言中的变量用来表示存放在内存中操作数,它 的值是可以改变的,变量的值就是操作数在内存中首字节的地 址,变量要事先定义才能使用。对于变量,类型属性说明变量在 内存中占多少个字节,其属性有BYTE(字节)、WORD(字)、 DOUBLE WORD(双字)3种。
☆ 变量定义伪指令
初值表给出变量的初始化值,有多个值时用逗号分隔。 初始化值可以是数值常数,也可以是表达式、?,还可以 由$、重复操作符DUP组成。其中: ?表示未赋初值; $ 表示将要分配的内存单元的偏移地址; DUP表示重复初值。 格式为:重复次数 DUP(重复参数) 说明:重复参数可以是多个,之间用逗号间隔。 举例:2 DUP(1,2) ;等价于1,2,1,2
☆ 常量--整数常量
字符串常量是由单引号或双引号括起来的单个字符或多个字符构成的。汇编程序把引号中的字符翻译成它的ASCII码值。如:‘A’(等于41H)、‘BC’(等于4243H)、“HELLO”等。
☆ 常量—字符串常量
汇编语言中的运算符与表达式
运算符:汇编中的运算符分为6大类,它们是:算术运算符、 移位运算符、逻辑运算符、关系运算符、分析运算符、合成运算 符(见课本P131表5-1)。 表达式:表达式是常数、寄存器、标号、变量与一些运算 符和操作码相组合的序列。 表达式的运算不由CPU完成,而是在程序汇编过程中进行 计算确定,并将表达式的结果作为操作数参与指令所规定的操 作。 当各种运算符同时出现在同一表达式中时,按照运算符的 优先级进行计算,对于优先级相同的运算符,按照从左到右的 顺序进行计算(见课本P132表5-2)。
第5章 变量 汇编语言程序设计 教学课件
DB 7,8,9,10 d9 DW '12', 'AB' d10 DW 3-5 data ENDS
第5章 变 量
【解】
(1)变量d1是字节型,初值是01H,占1字节。
(2)变量d2是字型,初值是1234H,占连续的2个字节, 并且地址号大的字节中放12H,地址号小的字节中放34H。
(3)变量d3是双字型,初值是12345678H,占连续的4个 字节,按地址由小到大的次序,4个字节中的内容依次是78H、 56H、34H、12H。
第5章 变 量
5.1.3 变量的三个基本属性
任何变量表面上都以一个标识符的形式出现,也就是它 的名字,每个变量都有三个数据与之相对应,这就是变量的 三属性。
5.1.3.1 段属性
变量的段属性也就是变量所在段的段地址。变量定义必须 写在一个段的范围之内,每个段在程序进入内存时被操作系 统安排一个确定的段地址。在编写程序时可以用段的名字指 出某处要使用段地址,而这个段中的所有变量都统一地以这 个段地址作为逻辑地址中的段部分。
【例5.1】 占据的内存字节数。
第5章 变 量
data SEGMENT d1 DB 1 d2 DW 1234H d3 DD 12345678H d4 DB '1', '2', '3' d5 DB '123' d6 DB 30 DUP(0) d7 DB 1,3 DUP(2), '3',-3,1001B d8 DB 1,2,3,4,5,6
(7)变量d7是字节型,共占7个字节,各字节的初值按 地址由小到大的次序依次是01H、02H、02H、02H、33H、 0FDH、09H,把各种写法混合在一个变量的定义中使用。
第5章 变 量
【解】
(1)变量d1是字节型,初值是01H,占1字节。
(2)变量d2是字型,初值是1234H,占连续的2个字节, 并且地址号大的字节中放12H,地址号小的字节中放34H。
(3)变量d3是双字型,初值是12345678H,占连续的4个 字节,按地址由小到大的次序,4个字节中的内容依次是78H、 56H、34H、12H。
第5章 变 量
5.1.3 变量的三个基本属性
任何变量表面上都以一个标识符的形式出现,也就是它 的名字,每个变量都有三个数据与之相对应,这就是变量的 三属性。
5.1.3.1 段属性
变量的段属性也就是变量所在段的段地址。变量定义必须 写在一个段的范围之内,每个段在程序进入内存时被操作系 统安排一个确定的段地址。在编写程序时可以用段的名字指 出某处要使用段地址,而这个段中的所有变量都统一地以这 个段地址作为逻辑地址中的段部分。
【例5.1】 占据的内存字节数。
第5章 变 量
data SEGMENT d1 DB 1 d2 DW 1234H d3 DD 12345678H d4 DB '1', '2', '3' d5 DB '123' d6 DB 30 DUP(0) d7 DB 1,3 DUP(2), '3',-3,1001B d8 DB 1,2,3,4,5,6
(7)变量d7是字节型,共占7个字节,各字节的初值按 地址由小到大的次序依次是01H、02H、02H、02H、33H、 0FDH、09H,把各种写法混合在一个变量的定义中使用。
汇编语言课件第05章
11/37
第五章 汇编语言顺序程序设计
乘法指令只影响CF和 , 乘法指令只影响 和OF,其它条件码无定义 。 1)MUL: 若乘积的高一半为 ,则CF=OF=0, ) : 若乘积的高一半为0 , 否则, 否则,CF=OF=1。 。 2)IMUL:若乘积的高一半是低一半的符号位的扩展, 2)IMUL:若乘积的高一半是低一半的符号位的扩展, 则,CF=OF=0,否则,CF=OF=1。 ,否则, 。
13/37
第五章 汇编语言顺序程序设计
一、算术指令(5类) 算术指令( 类 1. 加法指令(ADD,ADC,INC) 加法指令( , , ) 2. 减法指令(SUB,SBB,DEC,NEG ,CMP ) 减法指令( , , , 3.乘法指令 MUL,IMUL) 3.乘法指令(MUL,IMUL) 乘法指令( 4.除法指令(DIV,IDIV) 除法指令( 除法指令 , ) 5.十进制调整指令(DAA,DAS等) 十进制调整指令( 十进制调整指令 , 等
12/37
第五章 汇编语言顺序程序设计
如何区分MUL和IMUL 和 如何区分 (1111,1111B)×(1111,1111B) , ) , ) 看作无数号数,上式为: 看作无数号数,上式为:FFH×FFH=FFE01H × 看作带符号数,上式为:(-1) 看作带符号数,上式为:( )×(-1)=1 :( ) 选用MUL或IMUL应根据实际情况而定。 或 应根据实际情况而定。 选用 应根据实际情况而定
21/37
第五章 汇编语言顺序程序设计
本章内容分三节: 本章内容分三节: 5.1 算术指令 5.2 逻辑指令 5.3 顺序程序举例
22/37
第五章 汇编语言顺序程序设计
二、逻辑指令 逻辑运算指令( 1. 逻辑运算指令(5个) 移位指令( 2. 移位指令(8个)
汇编语言程序设计基本方法PPT课件
• MOV
AX,[BX].DISP
• MOV
AX,[BX]+DISP
14
• (4) 段寄存器不是DS,而是ES时,用如下 方式表示:
• MOV AX, ES:[SI]
•
对BP寄存器
• MOV AL, DATA2[BP];; 对应SS段
15
3.2.1 数据传送类指令
17
3.2.1 数据传送类指令
5. 堆栈操作指令 堆栈
PUSH 源操作数 进栈指令:先调整堆栈指针,再把源操作数压 栈。
PUSH AX PUSH [SI+5]
18
3.2.1 数据传送类指令
– POP 目标操作数
– 出栈指令:先将栈顶2字节送目标操作数,再
调整
堆栈指针。
–
POP AX
–
POP [SI+5]
2、取有效地址指令(LEA) 将源操作数SRC的有效地址(偏移地址)送
入寄存器REG中
比较: MOV AX,10H[DI] LEA AX,10H[DI] (DI)=0500H,(DS)=0200H
16
3.2.1 数据传送类指令
3. 取地址指针指令 LDS/LES目标寄存器, 源操作数 指针传送指令 ADDR DD 1A2B3C4DH LDS SI, ADDR 4. 数据交换指令 XCHG 操作数1, 操作数2 交换指令,操作数1、2不能同为内存操作数 XCHG AX, [SI+0400H]
– PUSHF
– POPF – 16位标志寄存器进栈/出栈指令
19
• 功能:将源操作数SRC的一个字节或一个字 传送到目的操作数DST所指单元。
• 格式:MOV DST,SRC ;(DST)(SRC) • 其中SRC表示源操作数,DST表示目的操作
汇编语言程序设计课件 第5讲 变量定义和存储器寻址
mov ax, 0b800h mov ds, ax mov al,'A' mov bx,00H Again: mov [BX], al mov [bx+1],0ECH inc al inc bx inc bx cmp al,'Z' jbe again int 20h
存储单元表示小结
直接给出地址
Mov [02h] ,’H’
E命令 格式
例
修改内存内容 E address,[list]
E 1000 E 1000 1 2 3 4 从1000 开始输入存入的内容 从1000开始依次存入1 2 3 4
F命令 格式
例
内存填充命令 F range list
F 2000 L15 1 2 F 2000 2100 3 4 依次将1,2存入2000~2014 依次将3,4存入2000~2100
Inbuff Sum db Min db Max db db 0,0,0,0,0,0,0,0,0,0 ? ? ?
“大型”程序的设计方法
可以分别设计和调试三个部分
数据输入部分
接收10个一位数保存在inbuff数组中
数据处理部分
统计总分sum和最大值max和最小值min sum max min 计算sum-max-min sum
说明
错误原因
Mov bx,buff 的含义是将buff地址的内容复制 到bx中。
由于buff类型是字节( DB ),而bx为字寄存器
本例中需要的是buff的地址值(而不是其中 的内容)
指令 mov bx, offset ptr buff
将 buff地址复制到bx C语言 bx=&buff
指令 lea bx , buff
存储单元表示小结
直接给出地址
Mov [02h] ,’H’
E命令 格式
例
修改内存内容 E address,[list]
E 1000 E 1000 1 2 3 4 从1000 开始输入存入的内容 从1000开始依次存入1 2 3 4
F命令 格式
例
内存填充命令 F range list
F 2000 L15 1 2 F 2000 2100 3 4 依次将1,2存入2000~2014 依次将3,4存入2000~2100
Inbuff Sum db Min db Max db db 0,0,0,0,0,0,0,0,0,0 ? ? ?
“大型”程序的设计方法
可以分别设计和调试三个部分
数据输入部分
接收10个一位数保存在inbuff数组中
数据处理部分
统计总分sum和最大值max和最小值min sum max min 计算sum-max-min sum
说明
错误原因
Mov bx,buff 的含义是将buff地址的内容复制 到bx中。
由于buff类型是字节( DB ),而bx为字寄存器
本例中需要的是buff的地址值(而不是其中 的内容)
指令 mov bx, offset ptr buff
将 buff地址复制到bx C语言 bx=&buff
指令 lea bx , buff
汇编语言程序设计及上机指导指令格式与寻址方式PPT学习教案
MOV AX,[BP]
;默认SS为段基址
如果操作数不在上述规定的默认段,则必须在指令中相应的操作数前加上 段超越前缀。
MOV CX,DS:[BP] 问
;DS:是段超越前缀, 表示访
数据段,而非堆栈段
2)32位寻址时,8个32位通用寄存器均可作寄存器间接寻址。
MOV CH,[EAX]
MOV DX,[EBX]
2021年6月25日星期五
四.端口寻址方式
端口寻址方式只在对外部设备的访问 指令中适用,包括端口的直接寻址和 间接寻址两种方式,具体细节在3.3.1 节的I/O数据传送类指令的叙述中, 结合具体指令详细介绍。
2021年6月25日星期五
第18页/共20页
段寄存器的使用规则
存储器操作类型 取指令
默认 段寄存器
;或写成MOV AX,[BX][SI],BX决定默认段基址由DS指出 MOV EAX,[EDX][EBP] ;由EBP决定默认SS为段基址寄存器 MOV R12,[EAX+EDX]
;用于64位方式,有效地址为EAX+EDX的和再扩展为64位 MOV RBX,[R10+RBP] ;有效地址为R10+RBP的64位和。
BX 2000H
…… 低地址
SI 3000H 和 5000H
机器 指令 ……
AH AL AX 56H 78H
5000H 5001H
78H 56H ……
高地址
图3.6 基址加变第址1寻5页址/共的2执0页行过程
2021年6月25日星期五
(5)带位移的基址加变 址寻址
EA=[基址寄存器]+[变址寄存器]+位移量
MOV RAX,[RBX×8+10H]
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
说明
显示存储器 B800:0000地址开始的内存对应屏幕上 每个位置要显示的字符 每2个字节对应一个位置 1:要显示内容的ASCII码 2:显示方式 [前景][背景]
修改颜色
hex 0 1 2 3 4 5 6 7 8 9 a b c d e f
bin 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
将buff偏移地址复制到bx
修改程序
Mov cx,9 Mov bx,offset ptr buff Mov al,[bx] Inc bx Again: cmp al,[bx] jae next mov al,[bx] next: inc bx dec cx cmp cx,0 jne again mov max,al int 20h ;或 lea bx , buff 或
实例3:显示26个大写字母
mov ax, 0b800h mov ds, ax mov al,'A' mov bx,00H Again: mov [BX], al inc al inc bx inc bx cmp al,'Z' jbe again int 20h
实例4:显示26个大写字母(带色彩)
Inbuff Sum db Min db Max db db 0,0,0,0,0,0,0,0,0,0 ? ? ?
初始化存数下标bx 键盘输入一个一位数 保存到数组inbuff[bx]中 数组下标+1 数组下标!=10?
2
数据处理
统计总分sum和最大值max和最小值min 计算sum-max-min sum
Inbuff Sum db Min db Max db db 0,0,0,0,0,0,0,0,0,0 ? ? ?
“大型”程序的设计方法
可以分别设计和调试三个部分
数据输入部分
接收10个一位数保存在inbuff数组中
数据处理部分
统计总分sum和最大值max和最小值min sum max min 计算sum-max-min sum
实例2:【一维数组】找最大数
内存变量buff中存放了十个单字节无符号数, 将最大值找出并存放在变量max中。 数据定义
Buff db 3,6,2,7,11,15,4,12,4,1 Max db ?
思路
先将第一个数取到al中 从第二个数开始,重复下列操作9次
比较al和该数,如果al较小,将该数据取入al
修改程序
mov al,a add al,b sub al,c mov x,al int 20h a db 3 b db 10 c db 5 x db ?
程序
mov add add sub int x,0 x,a x,b x,c 20h
注意
变量定义的位置,目前我们放 在不影响程序运行的地方:最后 最后
E命令 格式
例
修改内存内容 E address,[list]
E 1000 E 1000 1 2 3 4 从1000 开始输入存入的内容 从1000开始依次存入1 2 3 4
F命令 格式
例
内存填充命令 F range list
F 2000 L15 1 2 F 2000 2100 3 4 依次将1,2存入2000~2014 依次将3,4存入2000~2100
第五讲 变量定义和存储器寻址
1. 2. 3. 4. 5. 数据在存储器中的存放和存取 变量的定义和使用 存储器寻址 “大型”程序设计方法 作业
1、数据在存储器中的存放和存取
使用DEBUG观察
D命令 格式 显示内存内容 D [range]
显示2000~2030的内容 显示2000开始长度33的内容 D 开始地址,结束地址/长度 例 D 2000 2030 D 2000 L33
mov ax, 0b800h mov ds, ax mov al,'A' mov bx,00H Again: mov [BX], al mov [bx+1],0ECH inc al inc bx inc bx cmp al,'Z' jbe again int 20h
存储单元表示小结
直接给出地址
Mov [02h] ,’H’
开始 初始化: 计数器=9,取数地址=buff Al [取数地址],取数地址 取数地址+1
AL >= [取数地址]? Al [取数地址]
取数地址 取数地址+1 计数器 计数器 - 1 计数器=0? Max 结束 AL
Mov cx,9 Mov bx,buff Mov al,[bx] Inc bx Again: cmp al,[bx] jae next mov al,[bx] next: inc bx dec cx cmp cx,0 jne again mov max,al int 20h
数据输出部分
输出 sum (显然 sum 最大72 ,两位数输出)
数据输入
1
接收10个一位数保存在inbuff数组中 mov bx,0 Input: mov ah,1 int 21h sub al,30h mov inbuff[bx],al inc bx cmp bx,10 jnz input int 20h
对比
Mov word ptr [1000],1234 Mov word ptr [1001],5678
分析
实例1:Hello! (使用直接写屏方式)
显示Hello!
mov mov mov mov mov mov mov mov int mov mov mov mov mov mov mov mov mov mov mov int ax, 0b800h ds, ax [02h], 'H' [04h], 'e' [06h], 'l' [08h], 'l' [0ah], 'o' [0ch],'!' 20h ax, 0b800h ds, ax [02h], 'H' [04h], 'e' [06h], 'l' [08h], 'l' [0ah], 'o' [0ch],'!' [03h],11101100b [05h],11100100b [07h],4fh 20h
Buff db 3,6,2,7,11,15,4,12,4,1 Max db ?
程序的另一种写法
Mov bx,0 Mov al,[bx+buff] Again: cmp al,[bx+buff] jae next mov al,[bx+buff] next: inc bx cmp bx,10 jne again mov max,al int 20h Buff db 3,6,2,7,11,15,4,12,4,1 Max db ?
3 输出回车换行 求sum 的 十位数 BL 个位数 BH BL= 0 ? 输出BL对应数码 输出 对应数码
输出BH对应数码 输出 对应数码 4
完整程序
Mov bx,0 Input: mov ah,1 int 21h sub al,30h mov inbuff[bx],al inc bx cmp bx,10 jnz input mov bx,0 mov ah,0 mov ch,0 mov cl,10 procs: mov al,inbuff[bx] add ah,al cmp al,cl jae L1 mov cl,al L1: cmp al,ch jbe L2 mov ch,al L2: inc bx cmp bx,10 jnz procs mov max,ch mov min,cl sub ah,ch sub ah,cl mov sum,ah Mov ah,2 Mov dl,10 Int 21h Mov ah,2 Mov dl,13 Int 21h mov ah,0 Mov al,sum Mov bl,10 Div bl Mov bx,ax Cmp bl,0 Jz skip Mov dl,bl Add dl,30h Mov ah,2 Int 21h Skip: mov dl,bh add dl,30h mov ah,2 int 21h int 20h Inbuff Sum db Min db Max db db 0,0,0,0,0,0,0,0,0,0 ? ? ?
综合实例1:统计
接收从键盘输入的10个人的成绩(成绩为 0~9),计算去掉一个最高分和一个最低分后 的总成绩输出。 思路
首先接收10个一位数保存在inbuff数组中 然后统计总分sum和最大值max和最小值min 然后统计总分 和最大值 和最小值 最后计算sum=sum-max-min并输出
数据定义
直接寻址 寄存器间接寻址 寄存器相用寄存器+常数
Mov [BX+1] ,’A’
2、变量的定义和使用
如何定义变量
格式 [变量名] [数据类型][数据列表] [;注释] 【变量名】 【数据类型】 DB DW DD DF DQ DT 【数据列表】 例 A db 1,2,3,4,5 B dw 1,2,3,4,5 C dd 1,2,3,4,5
2 读数下标 bx 0 总分 ah 0 最大值 ch 0 最小值 cl 10 读取一个数 ah ah+al AL
al >= cl ? cl al
al <=ch ? ch al
数组下标+1 数组下标!=10?
计算sum-max-min sum
3
数据输出
输出整数 sum Mov ah,2 Mov dl,10 Int 21h Mov ah,2 Mov dl,13 Int 21h mov ah,0 Mov al,sum Mov bl,10 Div bl Mov bx,ax Cmp bl,0 Jz skip Mov dl,bl Add dl,30h Mov ah,2 Int 21h Skip: mov dl,bh add dl,30h mov ah,2 int 21h int 20h