天津大学微机原理第4章汇编语言程序设计
微机原理与接口技术-第4-1章

例4-3 用键盘最多输入10个字符,并存 入内存变量Buff中,若按“Enter”键,则 表示输入结束。
用BIOS层功能调用实现 层功能调用实现 的源程序: 的源程序: .MODEL SMALL CR EQU 0DH .STACK 200H .DATA Buff DB 10 DUP(?) .CODE .STARTUP MOV CX, 0AH LEA BX, Buff
Windows层功能模块的调用
Win32 API使用堆栈来传递参数 API函数调用 C语言的消息框函数的声明: int MessageBox( HWND hWnd, // handle to owner window LPCTSTR lpText, // text in message box LPCTSTR lpCaption, // message box title UINT uType // message box style );//参数 最后还有一句说明: Library: Use User32.lib.//说明这个函数的位置
API 函数的返回值
有的API 函数有返回值,如MessageBox 定义 函数有返回值, 有的 的返回值是int类型的数,返回值的类型对汇编 的返回值是 类型的数, 类型的数 程序来说也只有dword 一种类型,它永远放在 一种类型, 程序来说也只有 eax 中。如果要返回的内容不是一个 如果要返回的内容不是一个eax所能 所能 容纳的, 容纳的,Win32 API 采用的方法一般是返回一 个指针, 个指针,或者在调用参数中提供一个缓冲区地 干脆把数据直接返回到缓冲区中去。 址,干脆把数据直接返回到缓冲区中去。
.REPEAT MOV AH, 0H INT 16H .BREAK .IF AL==CR MOV [BX],AL INC BX .UNTILCXZ .EXIT 0 END
天津大学 微机原理 课件 第四章

常量的应用:
(1) 在指令语句中作立即数
MOV CX, 100
(2) 在指令语句中作偏移量
MOV AX, 34[SI]
(3) 在数据定义语句中作初值
X DB 12H, 34H
2.表达式和运算符
算术运算符 逻辑运算符 关系运算符 分析运算符 综合运算符
算术运算符(+, -, *, /, MOD,SHL,SHR)
运算符 格 式 运 算
+ 表达式1+表达式2 表达式1-表达式2 * 表达式1*表达式2 / 表达式1/表达式2 MOD 表达式1 MOD 表达式2 SHL 表达式SHL COUNT SHR 表达式SHR COUNT
求表达式1、表达式2之和 求表达式1、表达式2之差 求表达式1、表达式2之积 求表达式1、表达式2之商 取余数 左移 右移
标号也有三种属性:
1、段属性——定义标号所在段的起始地址
2、偏移属性——从段起始地址到定义标号的 位置之间的字节数 3、类型属性——表示它的转移特性 NEAR (近) FAR (远) 段内转移 段间转移
分析运算符:提取标号和变量的属性 (SEG,OFFSET,TYPE,LENGTH,SIZE)
(1)SEG:提取标号或变量的段基址 OFFSET:提取标号或变量的偏移地址 (2)TYPE:提取标号或变量的类型属性,常用数字表示 (3)LENGTH和SIZE(两者只用于DUP定义的变量)
伪指令 DB DW DD DQ DT
占字节数 1 2 4 8 10
当一个定义的存储区内的每个单元要放置同样的数 据时,可用DUP操作符。
2. 符号定义伪指令(EQU,=)
格式:名字 EQU 表达式 名字 = 表达式 操作:为表达式取一个名字,供以后引用
微机原理与接口技术-汇编语言程序设计

4.1.2 8086汇编语言源程序的格式
源程序的一般格式为: NAME1 SEGMENT
语句 语句 NAME1 ENDS NAME2 SEGMENT 语句 语句 NAME2 ENDS END <标号>
第四章 汇编语言 程序设计
4.2 语句的格式
第四章 汇编语言 程序设计
汇编语句分为指令语句和伪指令语句两类,一般都由分 隔符分成的 4 个部分组成。
HLT
;然后停机
NOT DONE : IN AL, PORT_VAL ;未超过时,输入下一字节
ADD SUM, AL
;与以前的结果累加
JMP CODE ENDS ;代码段结束
END START
;整个程序结束
可以看到,8086汇编的一个语句行是由4个部分组成,即
标号 操作码 操作数 ;注释(或名字)
普通高等学校计算机教育“十三五”
微机原理与接口技术
内容导航
CONTENTS
4.1 汇编语言的格式 4.2 语句的格式 4.3 伪指令语句 4.4 指令语句 4.5 汇编语言程序设计及举例
4.1 汇编语言的格式
4.1.1 8086汇编语言的一个例子
第四章 汇编语言 程序设计
MY_DATA SEGMENT ;定义数据段
SUM DB ?
;为符号 SUM 保留一个字节
MY_DATA ENDS
;定义数据段结束
MY_CODE SEGMENT ;定义码段
ASSUME CS :MY_CODE, DS :MY_DATA
;规定 CS 和 DS 的内容
PORT_VA1 EQU 3
;端口的符号名
START :MOV AX, MY_DATA ;DS 初始化为 MY_DATA
[计算机硬件及网络]微机原理与接口技术汇编语言程序设计
![[计算机硬件及网络]微机原理与接口技术汇编语言程序设计](https://img.taocdn.com/s3/m/e405213ade80d4d8d15a4f88.png)
ORG 200H
;目标程序的偏移量
DATA SEGMENT
;数据段开始
指令性语句和指示性语句的最大区别就是指示性 语句在标识符和伪指令助记符没有冒号
4.2 汇编语言程序结构
段定义伪指令SEGMENT、ENDS、ASSUME
伪指令SEGMENT和ENDS总是成对出现。SEGMENT用来定义 段开始,ENDS是来定义段结束。这一段伪指令可以将源程序 分为几个段,通常为数据段,堆栈段和代码段。
汇编语句语句格式
指令性语句的格式如下:
<标识符:> 指令助记符 目标操作数 <,源操作数> <;注释>
START: MOV AX,1090H
;将16进制数1090H送入AX
INC BX
指示性语句的格式如下:
<标识符> 伪指令助记符 <操作数1,操作数2…> <;注释>
CR DB ODH
;在字节单元CR处存放数据0DH
段,所以错误信息并不
←“no stack segment”
影响程序正常执行。
DEBUG和MASM的区别
DEBUG是调试器,它的主要用途在于除错,能够 观察每条汇编语句运行后的结果,方便的修正汇编 程序中的错误。DEBUG中必须使用16进制的数。
MASM是一种编译器,它能将汇编源程序进行编 译、链接形成可执行文件,但汇编程序必须使用规 范书写方式,源程序中除了指令性语句,还必须加 入许多与指令语句无关的指示性语句,以供编译器 识别。 MASM中的数据默认为10进制。
汇编源文件 .ASM
汇编 MASM.EXE
目执行程序 .EXE
汇编语言语句类型
指令性语句
微机原理 CH4(3) 汇编语言程序设计

SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA (转下页) MOV DS,AX
8
第四章
MOV BX,OFFSET TAB
源程序清单:
DATA SEGMENT TAB DB 40H,79H,24H,30H DB 19H,12H,02H,78H DB 00H,18H DATA ENDS
MOV AL,5 XLAT MOV AH,AL MOV AL,7
XLAT
;返回DOS
MOV BX,AX CODE SEGMENT MOV AH,4CH ASSUME CS:CODE,DS:DATA INT 21H START:MOV AX,DATA MOV DS,AX CODE ENDS (转右) END START
…………… …………… MOV AH,4CH INT CODE ENDS END START
3
21H
第四章
顺序结构
分支结构
循环结构 子程序结构
顺序结构
4
பைடு நூலகம்
第四章
顺序结构
分支结构
循环结构 子程序结构
N Y Y
N Y
N
两个分支
5
三个分支
第四章
循环初始设置
顺序结构
循环条件判断? Y 循环体
RETURN:MOV AH,4CH INT 21H CODE ENDS END START
11
微机原理与接口技术习题答案4

第4章汇编语言程序设计1.已知在BUF的起始处保存有N个字符的ASCII码,编写汇编语言程序实现,将这组字符串传送到缓冲区BUFR中,并且使字符串的顺序与原来的顺序相反。
解:BUF DB "BONJOUR_BELLE"BUFR DB 100 DUP(?)MOV CX, NLEA SI, BUFLEA DI, BUFRADD DI,CXDEC DIL1:MOV AL,[SI]MOV [DI],ALINC SIDEC DILOOP L12.利用移位、传送和相加指令实现AX的内容扩大10倍。
解:将扩大后的结果放在DX:AX中,注意到10×AX=8×AX+2×AX。
XOR DX,DXSHL AX, 1RCL DX, 1MOV BX,AXMOV CX,DXSHL AX, 1RCL DX, 1SHL AX, 1RCL DX, 1ADD AX, BXADC DX, CX3.在缓冲区V AR中连续存放着3个16位的无符号数,编写程序实现将其按递增关系排列;如果V AR中保存的为有符号数,则再编写程序实现将其按递减关系排列。
解:V AR DW 1236,-432,3900XOR SI,,SIMOV AX,V AR[SI]CMP AX, V AR[SI+2]JAE L1XCHG AX, V AR[SI+2]L1:CMP AX, V AR[SI+4]JAE L2XCHG AX, V AR[SI+4]L2:MOV V AR[SI], AXMOV AX,V AR[SI+2]CMP AX, V AR[SI+4]JAE L3XCHG AX, V AR[SI+4]L3:MOV V AR[SI+2], AX4.编写程序段实现将AL和BL中的每一位依次交叉,得到的16位字保存在DX中,例如(AL)=01100101B,(BL)=11011010B,则得到的(DX)=10110110 10011001B。
微机原理与接口技术:09第4章 汇编语言程序设计

1. 常量——是没有任何属性的纯数值数据。它在汇编期间和程序运行 中不会发生任何变化。分为:数值常量、字符串常量和符号常量。 P84
2. 变量—— 是代表存放在某些存储单元的程序运行期间随时可以修改 的数据。它常以变量名的形式出现在程序中,可以认为是存放数据 存储单元的符号地址。变量可以用数据定义伪指令DB, DW, DD等 进行定义。
格式中的表达式可以是一个常量、符号、数值表达式、地 址表达式甚至可以是指令助记符。
20
2、等号语句 格式:符号名 = 表达式 功能:把表达式的值赋给符号名,等号语句与等值语句具
有相同的功能。它们的区别在于等号语句可以重复定义。
21
4.3.2 数据定义伪指令
数据定义伪指令用来定义变量的类型,给存储器赋初值, 或给变量分配存储空间,此类伪指令并不占用内存,无目标代 码。源程序经汇编后,各个变量的数据就被存储在
SHORT运算符决定JMP指令中转移地址的属性,指定转移地址是下
一条指令地址的-128~+127字节范围之内。
不同运算符的优先级如表4-2所示
18
伪指令用来指示汇编程序应该如何去处理汇编语言的源程 序。它们在汇编时被解释执行,除了部分语句可以申请存储空间 外,不产生任何目标代码。在8086汇编语言中规定了几十种伪 指令,本小节介绍重要的伪指令。
8
需要指出的是:标号和符号名的长度不能超过31个, ? 和 $字符、CPU内部的寄存器、汇编语言中的保留字等均不能作为 标号和符号名。
➢ 指令助记符——每条语句中必须包含指令助记符,表明该条指令 要求CPU完成的具体操作。如ADD, MOV, JMP等指令语句助记符, DB, PTR, EQU等伪指令语句助记符。
;定义数据段 ;定义被加数 ;定义加数
微机原理及运用第4章

关系运算的操作数也必须为数字操作数。当关系成立时, 其结果为全 1;当关系不成立时,其结果为全 0。 汇编语言中的表达式不能构成单独语句, 只能是语句的 一个部分, 例如: MOVAX, BUF+2
ADDAL, VAL AND 0FH
JMPAGAIN+3 MOVBL, VB LE VA
4.1汇编语言基本概念
4.1.1汇编语言与机器语言
我们已经学过高级语言,例如BASIC语言或FORTRAN 语言,无论哪种语言,它都规定了一系列用于编写程序的语 句和应该遵循的语法规则。人们根据一种语言给定的语句及 其语法规则就可以写出程序,计算机则通过执行已编好的程 序来完成人们要求它完成的各种复杂功能。汇编语言也一样, 根据汇编语言的语句及其语法规则可以写出汇编语言程序。 但汇编语言与高级语言有较大的区别,汇编语言中的语句与 机器的种类和型号密切相关。
部分, 汇编时不形成任何目标码。注释必须以分号“;”开 头。 它可以作为语句的一个部分,也可以作为一个单独的语 句。
4.1.3汇编语言中的常数与表达式
1. 常数 常数可以分数值常数和字符串常数两类。数值常数按其 基数的不同,可以有二进制数、八进制数、十进制数、十六 进制数等几种不同的表示形式, 汇编语言中采用不同的后缀 加以区分。 B: 表示二进制数。 例如, 10110011B。
表示一条指令的这些字符常称为助记符。 我们必须指出, 采用助记符写出的程序,机器是不能直接执行的,因为上面 我们已经指出, 处理器在设计时是按二进制指令码考虑的。 所以,采用汇编语言编写的程序在执行前还必须将其“翻译” 成机器语言。通常将采用助记符指令写成的程序,称为源程 序,将它翻译成的机器语言程序称为目标程序。将汇编语言 的源程序翻译成目标程序的过程称为汇编过程或简称汇编。 汇编过程通常是由计算机完成的。它是通过执行一个专门完 成汇编的软件——称为汇编程序来实现的。既然写出的源程序 要由汇编程序将其翻译后才能执行,所以,我们编写的源程 序必须符合汇编程序的一系列要求或者规则,只有这样,你 的程序才能被正确地“翻译”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
为便于理解程序,可以在程序中添加注释。在一行语句中,分 号“;”后面的内容为注释。注释部分经汇编后不会生成任何 机器指令码。若“*”在一行语句的第一列,则表示该行 为注释。
的机器指令,因此这些指令被称为伪指令(Pseudo Instruction)
。
汇编语言源程序以行为单位进行设计,每一行最多可以包含以下
四个部分:
标号 操作码 操作数 注释
5.4 HCS08 CPU与HC08 CPU的比较
(1)标号(Labels)
对于标号有下列要求及说明:
① 如果一个语句有标号,则标号必须从第一列开始书写。 ② 可以组成标号的字符有:字母A~Z、数字0~9、下划线“_”、美元
注意:汇编指令中的冒号(:)、逗号(,)、分号(;)、星 号(*)等标点符号要在英文状态下输入才合法,如果在中文 状态下输入,编译器会认作非法字符,在编写汇编代码时应该 注意把输入法的状态切换到英文输入状态。
4.2 08汇编语言基础
4.2.1 08汇编源程序格式
把汇编语言写成的源程序“翻译”成机器语言的工具叫汇编程
MUL
ADD #9
DONE:STA FUN
BRA $
END
习题一
1.若($70)=$24,将其传送到$80单元,否则传送到$81 单元。 讲评:1. $24是立即数2. 注意第一步结束要用BRA指令跳转 .3.不
符号“$”,但开头的第一个符号不能为数字和$。
③ 08编译器不区分标号中字母的大小写。 ④ 标号应小于16个字符。 ⑤ 标号后可以带冒号“:”,也可以不带冒号。 ⑥ 一个标号在一个程序中只能定义一次。 ⑦ 若一行中第一个字符是星号“*”,这是标号,表明该行为注释。 ⑧ 一行语句若只有标号,编译器将把当前程序计数器的值赋给该标号。 ⑨ 若希望更多的编译器能够识别,建议标号长度小于8个字符。 ⑩ “#”表示立即数。 ⑪ 操作码不能从第一列开始,否则会被当成标号.
第四章 汇编语言程序设计 4.1 编程的步骤
汇编语言程序设计,要求设计者对计算机的硬件结构(包括微机CPU、 存贮器结构、接口电路、外部设备特性等)有详细了解,此外应熟悉CPU的 指令系统和编程的基本技巧。 一. 分析问题:任务是什么?工作过程(顺序)?现有条件(硬件结构)、已知数据、 运算精度、处理速度等。 二. 确定算法:将实际问题转化为程序处理模块。 三 . 画程序流程图:
5.4 HCS08 CPU与HC08 CPU的比较
(2)操作码(Opcodes)
操作码包括指令码以及后面即将介绍的08编译器可以识别的伪指令 码。对于有标号的行,必须用至少一个空格或制表符(TAB)将标号与 操作码隔开。对于没有标号的行,不能从第一列开始写指令码,应以空 格或制表符(TAB)开头。08编译器不区分操作码中字母的大小写。
* ORG指令可多次使用。
㈡.汇编结束命令: 格式:END 功能:通知汇编程序结束汇编。
* END指令仅用于整个源程序的结束。
4.3 汇编语言程序的基本结构
一. 顺序程序:无分支、循环,程序按顺序逐条执行 用CODEWARRIOR编1+1; 二. 分支程序:按不同的条件执行不同的程序分枝。
程序实例:(注意条件转移语句在分支产生中的作用。) 例1:若$70单元中的8位2进制有符号数为正(或0),则将其除以3, 为 负则求其绝对值,结果存人$71单元。
(3)操作数(Operands)
操作数可以是地址、标号或指令码定义的常数,也可以是由伪运算 符构成的表达式。08编译器识别下列伪运算符:加(+)、减(-)、 乘(*)、除(/)、特殊除(\,允许被除数为0,此时认为结果也为0 )、左移(<)、右移(>)、取余数(%)、与(&)、或(|)、异 或(^)。如果超过一种运算或中间有插入空格应使用{}把它们包含在 内。
序或编译器(Assembler),以下统一称作编译器。
汇编语言源程序可以用通用的文本编辑软件书写编辑,以ASCII 码形式存盘。具体的编译器对汇编语言源程序的格式有一定的要求, 同时,编译器除了识别单片机的指令系统外,为了能够正确地产生目 标代码以及方便汇编语言的编写,编译器还提供了一些在汇编时使用 的命令、操作符号,在编写汇编程序时,也必须正确使用它们。由于 编译器提供的指令仅是为了更好地做好“翻译”工作,并不产生具体
FUN= X1-3
(若X1≧10)
= X1×8+9 (若X1﹤10) ;X1为8位UN: EQU $80
ORG $E000
LDA X1
CMP #10
BLO LESS ;BCS LESS if c=1; BMI if N=1
SUB #3
BRA DONE
LESS: LDX #8
以下为HCS08汇编程序中定义的一些常用伪指令。 ㈠. 汇编起始命令:
格式: ORG 16位地址 功能:定义此指令后面源程序的汇编地址(目标程序存放的首地址) 例: ORG 2000H START:LDA #64H
…… 则规定 LDA #64H从2000H单元开始存放,同时将标号START定义为 2000H。
ORG LDA BLT LDX CLRH DIV BRA ABS: NEGA DONE: STA BRA END
$E000 $70 ABS #3
;为负转绝对值处理BMI行吗?BLO呢? ;正数,除以3
DONE ;数值取反(按位取反后+1),不同于COM(按位取反) $71 $
例2:按下式计算函数的值,结果存入FUN 单元
(4)注释(Comments)
注释即是说明文字,若是处于指令之后,则用空格和分号“;”与 指令分开,若整行为注释文字,则在第一列写上“;”或“*”。
HCS08伪指令
4.2.2 伪指令(Pseudo):
在汇编程序中定义的各种汇编命令。用以指定程序的实际存放地址、 定义各种文字符号的数值等。这些命令并不产生机器码,仅起到汇编时 的辅助作用。