560 likes | 750 Views
4.1 汇编语言语句种类及其格式 1. 基本语句 机器指令语句:对应机器的一种操作,产生对应的目标代码。 伪指令语句:不产生对应的目标代码,伪汇编程序服务。 宏指令语句:用一条语句定义一组语句指令,产生一组机器 指令的目标代码或一组伪指令定的功能。 2. 指令语句 格式: [ 标号: ] 指令助记符 [ 操作数 [ ,操作数 ]] [ ;注释 ] 3. 伪指令语句 格式: [ 符号名 ] 伪指令 [ 参数, …… ,参数 ] [ ;注释 ].
E N D
4.1 汇编语言语句种类及其格式 1.基本语句 机器指令语句:对应机器的一种操作,产生对应的目标代码。 伪指令语句:不产生对应的目标代码,伪汇编程序服务。 宏指令语句:用一条语句定义一组语句指令,产生一组机器 指令的目标代码或一组伪指令定的功能。 2.指令语句 格式:[标号:] 指令助记符 [操作数[,操作数]] [;注释] 3.伪指令语句 格式:[符号名] 伪指令 [参数,……,参数] [;注释] 第四章 汇编语言 汇编语言程序设计
4.标识符(Identifier) • 指令语句中的标号和伪指令语句中的符号名统称为标识符。它们是由若干字符构成的。标识符的组成规则如下: • 字符个数不多于31个; • 第一个字符必须是字母,问号“?”,“@”或下划线“_”这四种字符中的一个; • 从第二个字符开始,可以是字母,数字,?,@或_; • 不能使用属于系统专用保留字(Reserved word)。 汇编语言程序设计
4.2汇编语言数据及伪指令 一、汇编语言数据 1.常数 (1)数值常数: 二进制常数:以字母B结尾,0和1组成的序列:0111001B 十进制常数:以字母D结尾(或省略),由0-9的数字组成 的序列。 十六进制常数:以字母H结尾,由0-F组成的序列。 八进制常数:以字母Q结尾,由0-7组成的序列,如:12345Q (2)串常数:由单引号括起来的一个或多个字符组成。 如:‘A’ , ’ABC’ 汇编语言程序设计
常数主要出现在: (1)在指令语句的源操作数中作立即数,它应与目的操作数的位数相一致,可以是8位或16位二进制数。 (2)在指令语句的寻址方式中作位移量。如: (3)在数据定义伪指令中。 汇编语言程序设计
2.变量 定义:数据存放地址的符号表示 变量有三种属性: 段属性:变量所在段的段首址 偏移地址属性:段首址到变量处的字节个数 类型属性:字节或字等类型,由类型定义伪指令定义。 DB:字节类型--1个字节 DW:字类型--2个字节 DD:双字节类型--4个字节 DQ:四字类型--8个字节 DT:十字节类型--1个数据占10个字节 汇编语言程序设计
在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下几种情况:在数据定义伪指令语句的操作数部分中,所示的表达式就是给定义的变量预置的初值,它们有如下几种情况: ①数值表达式:例如: DA_BYTE DB 23H,23 DA_WORD DW 0ABFH,1234H ②?表达式:不带引号的 ? 表示可预置任何内容。 例如 DA_B DB ?,? DA_W DW ?,? 汇编语言程序设计
③字符串表达式: • 对于DB伪指令,为字符串中每一个字符分配一个字节单元。字符串必须是用引号括起来的不超过255个字符。字符串自左至右以字符的ASCII编码按地址递增的排列顺序依次存放。例如: • STRl DB ‘ABCDEF’ • 在存储器中存放的情况如图4.1(a)所示。 • 对于DW伪指令,可以给两个字符组成的字符串分配两个字节存储单元,而且这两个字符ASCII码的存储顺序是前一字符在高字节,后一字符在低字节。每一个数据项只能是1~2个 • STR2 DW ‘AB’,‘CD’,‘E’ 汇编语言程序设计
④带DUP表达式:DUP是定义重复数据操作符。在表达式中,使用DUP操作符格式是: • DB • DW • [变量名] DD 表达式1 DUP(表达式2) ;注释 • DF • DQ • DT • 其中表达式1是重复的次数,表达式2是重复的内容。 • 例如: • D_DB1 DB 10H DUP(?) • D_DB2 DB 10H DUP(‘AB’) • D_DWl DW 10H DUP(9) • DUP操作符可以嵌套使用,即表达式2可以又是一个带DUP的表达式。例如 • D_DB3 DB 10H DUP(3,2 DUP(8),6) • 表示重复10H个数据序列“3,8,8,6”,共占有40H个字节单元 汇编语言程序设计
变量的使用 • 在指令语句中:如要对某存储单元进行存取操作,就可直接引用它的变量名(即符号地址), 例如: • DA1 DB 0ABH • DA2 DW 34A5H • : • MOV AL ,DA1 • MOV BX ,DA2 • 在许多指令语句中,无论在源操作数还是目的操作数中,采用了寄存器相对寻址或相对基址变址寻址。这时,引用一个变量名就是取用它的偏移量。例如: • DA3 DB 10H DUP(?) • DA4 DW 10H DUP(1) • : • MOV DA3[SI],BL • ADD AX,DA4[BX][DI] 汇编语言程序设计
在伪指令语句中:例如: • NUM DB 26H • SZ1 DW 10H DUP(0) • DZl DW NUM • DZ2 DD NUM • DZ3 DW SZ1[2] 汇编语言程序设计
例:DATA SEGMENT A DW M BUF DB ‘AB’,0AH,0DH CON EQU 500H B DW 0FFAAH D DD BUF M DB 2 DUP(1),2 DUP(2,’B’),’123’,1,2,3 DATA ENDS 问:(1)若执行下列指令后,(AX)=? LEA BX,M MOV AX,[BX+4] ;(AX)= 4202H (2)变量A,BUF,B,D,M的EA=?分别为:0,2,6,8,12 汇编语言程序设计
若DW存 地址,则 取它的EA 初始化变量 A+0 0CH +1 00 BUF+0 ’A’ +1 ’B’ +2 0AH +3 0DH B+0 0AAH +1 0FFH D+0 2 +1 0 +2 +3 M+0 01 +1 01 +2 2 +3 ’B’ +4 2 +5 ’B’ 若用DD存地址, 则取它的EA初始化 前一个字单元,取 段首址初始化第二 字单元。 +6 ‘1’ +7 ‘2’ +8 ‘3’ +9 1 +0AH 2 +0BH 3 DATA 汇编语言程序设计
3.标号 定义:机器指令语句存放地址的符号表示,也可表示过程名。 用于:转移指令和CALL语句的操作数项。 标号有三种属性:段,偏移地址及类型。 段属性:指定义该标号所在段的段首址。 偏移地址属性:标号的偏移地址为16位无符号数,它表示段 起始地址到定义符号的位置之间的字节数。 类型属性:制定符号在本段使用,还是在其它段中使用: NEAR:本段使用 FAR:段外使用 汇编语言程序设计
设置标号距离属性可以有以下两个办法 ①隐含方式:当在指令语句中,使用标号后,它就隐含有NEAR属性。如: ┇ LOPl:MOV AX,30H ┇ 这时,标号LOPl的距离属性为NEAR,表示它只能被本段的转移和调用指令所访问。隐含方式不可能有FAR属性。 汇编语言程序设计
②用LABEL伪指令赋予标号的距离属性。LABEL伪指令格式是:②用LABEL伪指令赋予标号的距离属性。LABEL伪指令格式是: 名称 LABEL 类型 其中名称是一个标识符,它可作为一个标号,也可作为一个变量名。伪指令LABEL通常要与指令语句或用DB、DW、DD伪指令的数据定义语句连用。这时,名称就为与之连用的指令或变量建立一个新的标识符(即新的标号或变量名),以便补充或设置与之连用的指令或变量的类型属性。因此,这个伪指令的名称同样有段、偏移量、类型三个属性。若与指令连用,类型属性分为NEAR和FAR两种;若与变量连用,类型属性就分为BYTE、WORD和DWORD等。它的段和偏移量同与之连用的指令或变量相同。 汇编语言程序设计
二、表达式与运算符 • 表达式 • 算术运算符 • 逻辑运算符 • 关系运算符 • 分析操作符 • 属性操作符 • 运算符优先级 表达式是操作数常见的形式,它是由常数、变量、标号通过操作运算符连接而成的。任一表达式的值是在程序汇编过程中进行计算确定的,不是在程序运行时求得的。 (1)算术运算符:+,-,×, /,MOD,SHR (右移),SHL(左移) 其中:SHR,SHL表示将常量右移或左移运算符,右边所规定的 次数(正数),空出的数位均补0。 汇编语言程序设计
如:MOV AL,A SHR 3 (立即数) 若A=11111111B,则: 表达式:A SHR 3, 结果为00011111BAL (2)逻辑运算符 按位操作运算符:AND(与),OR(或),XOR(异或),NOT(非) 注:运算法则同对应的指令运算 参加运算的必须是数字,结果是数字,只用于数值表达式中。 如:AND DX,789AH AND 0FH(立即数) (3)关系运算符:EQ , NE , LT , GT , LE , GE 参加运算的两个对象必须是数字,或同一段中两个单元地址(EA) 结果:真值为:0FFFFH(全“1”),假值为0(全“0”) 如:MOV BX,3 LT 5 ;(BX)=0FFFFH 立即数 汇编语言程序设计
(4)分析操作符 • TYPE • 格式:TYPE变量或标号 • 功能:若是变量:回送该变量以字节数表示的类型:DB为1, • DW为2,DD为4,DQ为8,DT为10。 • 若是标号:回送代表该标号类型的数值:NEAR为0FFFFH, • FAR为0FFFEH。 • LENGTH:取存贮单元个数算符 • SIZE:取存贮区大小算符 • SEG:取段首址算符 • OFFSET:取偏移地址算符 汇编语言程序设计
例:MOV BX,SEG OPE ;将OPE所在段的段首址送BX。 例子: DAT SEGMENT A DW 50,100,-70H B DB ‘ABCDEF’,5 DUP(0) C DW C-B ;变量C中的内容为以B为首址的数据存贮区 所占的字节数 DAT ENDS : : MOV AX,SEG B ;DAT AX,将B所在段的段首址AX MOV BX,OFFSET B ;6 BX,将B偏移地址是BX MOV CX,TYPE B ;回送B变量的类型表示的字节数;即1 CX MOV AX,A+2 ;(A+2)=100 AX,以A为首址再向下位移2个 : 字节的内容 AX 汇编语言程序设计
(5)属性操作符PTR 格式:类型 PTR 地址表达式 其中:类型为: BYTE 字节 WORD字 DWORD双字 NEAR段内 FAR段外 汇编语言程序设计
例如:在上例中 : : MOV AX,WORD PTR OPE ;0201H AX MOV AL,BYTE PTR OPER ;34H AL 在运算时重新定义OPE的类型为字 (但OPE类型并没有改变) 重新定义OPER类型为字节 PTR是用来指派操作数的类型。 例:MOV [BX],0 ×;0是立即数没有类型,[BX]类型不明确 MOV WORD PTR [BX],0 汇编程序规定: 单操作指令中的操作数的类型必须明确,且不能为立即数。 双操作指令中, 如果两个操作数的类型均明确,则类型必须一致。 如果一个操作数的类型明确,另一个模糊,则两个操作数类型 以明确的那一个为准。 汇编语言程序设计
例:DATA SGEMENT NUM DB 11H,22H,33H DATA ENDS : MOV AX,NUM ;×类型不一致 MOV AX,WORD PTR NUM ;(NUM)=2211H AX MOV BL,NUM ;(NUM)=11H BL MOV SI,0FFSET NUM ;NUM的EA SI ADD 2[SI],2 ;×类型均不明确 INC [SI] ;类型不明确 DEC BYTE PTR [SI] ;OPD=[SI]=NUM MOV BYTE PTR 2[SI],’A’ : 不能用PTR改变寄存器的类型MOV AL,BYTE PTR SI × 地址表达式中不允许出现不带方括号的寄存器号 MOV AX,SI+5 × 汇编语言程序设计
(6)算符优先级: 括号(圆括号,方括号,尖括号),SIZE,LENGTH : PTR OFFSET,SEG,TYPE,THIS HIGH,LOW *,/,MOD,SHL,SHR +,- EQ,NE,LT,LE,GT,GE NOT AND OR,XOR SHORT 高 低 汇编语言程序设计
三、 伪指令语句 包括:符号定义语句 数据定义语句 段定义语句 过程定义语句 结束语句 作用:为汇编程序服务,如给变量按类型分配存贮单元,说明 段和过程属性等。 汇编语言程序设计
1.符号定义伪指令 • 等价伪指令 • 格式:符号名 EQU 表达式 • 用途:给符号名定义一个值,别的符号名,一条可执行命令 • 等。 • 例如:PORT EQU 256 • BUF EQU PORT+2 • 等号伪指令 • 格式:符号名=表达式 • 如:EMP=6 • EMP=9 • 注:•等号伪指令可以给已定义符号名重新定义值,而等 • 价伪指令不能对符号名重新定义值。 • •不为已定义的符号名分配存贮单元。 汇编语言程序设计
2.过程定义伪指令 格式:过程名 PROC [NEAR]/FAR : RET 过程名 ENDP 汇编语言程序设计
3.置汇编地址计数器伪指令 汇编地址计数器用$符号表示。每汇编一个新段,则把汇编地 址计数器置为0,然后按语句汇编后的长度增值。段内的所有 标号或变量的偏移地址就是$的值。 如:DATA SEGMENT BUF DB ‘12345’ COUN EQU $-BUF ;COUN的值为BUF数据区所占的字节数, 即COUN=5 A DB ‘$’ DATA ENDS 汇编语言程序设计
设置汇编地址计数器的值的伪指令ORG 格式:ORG 数值表达式 功能:将汇编地址计数器设置成数值表达式之值(其值为 0-65535之间的非负整数) 如:DATA SEGMENT ORG 10 BUF DB ‘ABCD’ ORG $+5 NUM DW 50 DATA ENDS ;设置$的值为10,即该段的目标代码从偏移地址10处开始产生 ;变量BUF的偏移地址为10 ;$的值增5,即空出5个字节 ;变量NUM的偏移地址为19 其它伪指令:命令伪指令,结束伪指令等见书。 汇编语言程序设计
4.3汇编语言程序的段结构 一、完整的段结构 1.段定义伪指令 格式:段名 SEGMENT [定位类型] [组合类型] [‘类型’] … 段名 ENDS 其中:• 段名为用户自己定义的标识符:可以定义数据段, 附加数据段,堆栈段和程序代码段。 • 定位类型,组合类型,类别分别用来指明段名的属性, 一般在特定情况下选用,它们提供段的属性给连接装配 程序,用于对各段装配时使用。 如: 定位类型:告诉连接程序,前段放完后,后一段将从 什么起始地址边界存放。 汇编语言程序设计
PAGE(页):表示此段物理地址起始地址后8位为0PAGE(页):表示此段物理地址起始地址后8位为0 即×××× ×××× ×××× 0000 0000 PARA(节):表示此段物理地址起始地址后4位为0 即×××× ×××× ×××× ×××× 0000 WORD(字):表示此段必须从字的边界开始 即×××× ×××× ×××× ×××× ×××0 BYTE(字节):表示此段可以从任何地址开始 即×××× ×××× ×××× ×××× ×××× 省略定位类型,即为PARA 组合类型:告诉连接程序,本段与其它段的关系。 汇编语言程序设计
NONE:本段与其它段在逻辑上不发生关系,每段有自己的NONE:本段与其它段在逻辑上不发生关系,每段有自己的 基地址:隐含的组合类型。 PUBLIC:把本段与同类别的其它段相邻地连在一起,给定 一个共同段基地址,大小不超过64K。 STACK:指定该段在运行时为堆栈的一部分。 COMMON:连接程序为本段与其它同名同类别段指定相同 的基地址,产生覆盖存贮。 AT表达式:连接程序把本段装在表达式的值所指定的段地址 上,它不能指定代码段。 MEMORY:连接程序将把本段定位在被连接一起的其它所有 段之上。 例:DAT1 SEGMENT A DB 55H DUP(0FFH) DAT1 ENDS DAT2 SEGMENT DB 64H DUP(0) DAT2 ENDS 它们均未指定定位方式,即 定位方式为PARA,连接后: 一般选用PARA定位形式。 汇编语言程序设计
1000H:0000H 0FFH 1000H:0001H 0FFH : : : : 1000H:0054H 0FFH 1000H:0055H : : : 1000H:005FH : 1006H:0000H 00 : : 1006H:0063H 00 DAT1 DS DAT1段 共55H个 字节 1000H 两个段 之间浪费 1个字节 DAT2 ES DAT2段 共64H 字节 1006H 若选用WORD,说明DAT2物理首址为偶数开始 即1000H:0056H,只浪费1个字节单元 若用BYTE,不浪费单元 若DAT2选用PAGE,则DAT1与DAT2之间浪费171个字节单元。 汇编语言程序设计
例:组合类型: 一个大型汇编源程序可能会有若干个模块组成(一个以END结束 为一个模块),模块内可能包含若干个段,当把模块连接装配 起来时,会出现多个代码数据段或堆栈段的情况。给程序编号 与调试带来不变,加之PC的CPU一次只能同时访问4个段,因此 可利组合类型指示连接程序,将各模块的相同性质的段组合成 一个数据段,一个堆栈段,在编写程序时不考虑段的连接问题。 类别为单引号括起来的字符串,一般为:‘CODE’,’DATA’, ‘DATA’,’STACK’ 功能:按类别名相同的段(段名不一定相同)组织起来存放 在连接的存贮区中。 如:A SEGMENT ‘DATA’连接后,在生成.EXE中,位置为: B SEGMENT ‘CODE’ A SEGMENT ‘DATA’ C SEGMENT ‘DATA’ C SEGMENT ‘DATA’ B SEGMENT ‘CODE’ 汇编语言程序设计
模块1 0000H:0000H 00 : : 0000H:0054H 00 空11个字 节单元 0000H:0060H 0FFH : 0000H:0162H 0FFH 空13个字 节单元 0017H:0000H 00 : 0017H:0201H 00 : : : A SEGMENT PARA PUBLIC ‘S’ A1 DB 55H DUP(0) A ENDS B SEGMENT PARA COMMON ‘S1’ B1 DB 202H DUP(0) B ENDS 邻接 存放 不超 过64K A段 模块2 B1和 B2公 共存 贮区 (覆 盖存 放) : A SEGMENT PARA PUBLIC ‘S’ A2 DB 103H DUP(0FFH) A ENDS B SEGMENT PARA COMMON ‘S1’ B2 DB 104H DUP(0) B ENDS B段 汇编语言程序设计
2.ASSUME伪指令 指明定义的当前段与段寄存器的关系 格式 :ASSUME段寄存器名:段名,段寄存器:段名,…… 例:A SEGMENT : AA DW 0FFH A ENDS B SEGMENT STACK : B ENDS C SEGMENT C1 DB ‘A’ C ENDS D SEGMENT : DD1 DW 11H : D ENDS E SEGMENT ASSUME CS:E,SS:B,DS:A,ES:D MOV AX,A MOV DS,AX MOV AX,D MOV ES,AX E1:MOV AX,AA E2:MOV DD,AX ASSUME DS:NOTHING ASSUME DS:C MOV AX,C1 : E ENDS 汇编语言程序设计
注:(1)每一次CPU最多访问4个段。 (2)必须用ASSUME建立CS,SS与代码段和堆栈段的关系。以 避免写跨段前缀。 (3)对于数据段,可用ASSUME建立与DS,ES的关系,也可不 用。同时,不必写跨段前缀。否则需写跨段前缀。 如:上例:如不用ASSUME建立A,D与DS,ES的联系,则必 在EI处写:EI:MOV AX,DS:AA 汇编语言程序设计
3.段寄存器的装入 • DS和ES的装入 • 在程序中,引用段名就是以立即数形式获取该段的段基值,而立即数又不能直接传送给段寄存器,所以一个段的段基值要经过通用寄存器传送给DS,ES。例如: • DATA_DS SEGMENT • DAl DB ? • DATA_DS ENDS • DATA_ES SEGMENT • DA2 DB ? • DATA_ES ENDS • CODE SEGMENT • ASSUME CS:CODE,DS:DATA_DS,ES:DATA_ES • START: MOV AX,DATA_DS • MOV DS,AX • MOV AX,DATA_ES • MOV ES,AX • ┇ • CODE ENDS 汇编语言程序设计
SS的装入 • 装入办法有两个: • (1)段定义伪指令的组合类型项选择“STACK”参数,且在段寻址伪指令(Assume)语句中,把堆栈用的这个段指派给段寄存器SS。例如: • STACK1 SEGMENT PARA STACK • DB 60H DUP(?) • STACKl ENDS • ┇ • CODE SEGMENT • ASSUME CS:CODE,SS:STACKl • ┇ • 这样,当这个程序目标代码装入存储器后,SS中已自动装入STACK段的段基值,且堆栈指针SP也指向堆栈底部+1的存储单元(在上例中(SP)=60H)。 汇编语言程序设计
(2)若在段定义伪指令的组合类型中,未选用“STACK”参数项,或在程序中要调换另一个堆栈段,可用类似于DS,ES的装入办法,且需几条指令来实现对SS和SP的装入。例如:(2)若在段定义伪指令的组合类型中,未选用“STACK”参数项,或在程序中要调换另一个堆栈段,可用类似于DS,ES的装入办法,且需几条指令来实现对SS和SP的装入。例如: STACK1 SEGMENT DW 50H DUP(?) TOP LABEL WORD STACK1 ENDS ┇ CODE SEGMENT ┇ MOV AX,STACK1 MOV SS,AX MOV SP,OFFSET TOP 上述示例中,假设STACK1段是程序中要使用的堆栈段(50H个字),那么TOP就是该堆栈的初始堆栈顶部。待用前两条指令把堆栈段的段基值装入SS后,紧接着必须用一条指令初始化堆栈指针SP(在示例中(SP)=100H)。中间不要插入另外的指令。 汇编语言程序设计
CS的装入 • 在程序执行过程中,CS提供了当前执行目标代码的段基值,而IP提供下一条目标代码的偏移量。为保证程序的正确执行,CS和IP装入新值必须一起完成。对CS,IP的装入通常是: • (1)按照结束伪指令END指定地址装入CS和IP。任何一个源程序都以END伪指令来结束。这个伪指令的格式是: • END 起始地址 • 起始地址可以是一个标号或表达式。该起始地址是程序装入内存后,开始执行的起始点。通常,程序执行的第一条语句(不一定是源程序的第一条指令语句!)设置一个标号。如: • ┇ • CODE SEGMENT • ASSUME CS:CODE • BEGIN: MOV AX,DATA • ┇ • CODE ENDS • END BEGIN 汇编语言程序设计
(2)在程序运行期间,当执行某些指令或操作时,CPU自动修改CS和IP使它们指向新的代码段,例如: (2)在程序运行期间,当执行某些指令或操作时,CPU自动修改CS和IP使它们指向新的代码段,例如: ·执行段间过程调用指令CALL和段间返回指令RET; ·执行段间无条件转移指令JMP; ·响应中断及中断返回指令IRET; ·执行硬件复位(RESET)操作。 以上几种情况,不需要程序员干预,程序自动修改CS、IP的内容。 汇编语言程序设计
二、简化的段结构 1、模式选择伪指令.MODEL 模式选择伪指令用来指定该汇编程序所使用的内存模式,内存模式说明了程序中的数据及代码的缺省长度。使用简化的段定义的程序必须使用.MODEL指出内存模式,格式如下: .MODEL 模式 模式可选择TINY、SMALL、MEDIUM、COMPACT、LARGE中的一种,一般选用SMALL模式。 2、数据段定义伪指令.DATA 伪指令.DATA定义数据段,格式如下: .DATA [段名] 若段名缺省,则隐含段名为_DATA。如果有多个数据段,就要用段名来区分。 汇编语言程序设计
3、代码段定义伪指令.CODE 伪指令.CODE代码段,格式如下: .CODE [段名] 若段名缺省,则隐含段名为_CODE。如果有多个代码段,就要用段名来区分。 4、堆栈段定义伪指令.STACK 伪指令.STACK定义堆栈段,格式如下: .STACK [长度] 长度的默认值为1024。 汇编语言程序设计
3.4常用的I/O系统功能调用 直接调用DOS中功能子程序(即在DOS级上调用):详见P405 系统功能 设备管理(I/O系统功能调用) 文件管理 目录管理 其它管理 调用的一般过程:•功能编号 AH,置入口参数 •执行软中断语句INT 21H •判错 常用的I/O系统功能调用: 1.键盘输入(调用功能号1) 调用格式:MOV AH,1 INT 21H 功能:等待从键盘输入一个字符并将输入字符的 ASCII码⇒AL,若按CTRL+BREAK退出 汇编语言程序设计
2.显示输出(调用功能号2) 调用格式:MOV DL,’a’;待显示字符(如‘a’)的ASCII码 DL MOV AH,2 INT 21H 功能:将DL中的字符送屏幕。若DL中为(CTRL+BREAK的ASCII 码,退出) 例:MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH INT 21H 显示回车 显示换行 3.打印输出(功能调用号5) 调用格式:MOV DL,’a’ ;待打印字符 DL MOV AH,5 INT 21H 功能:将DL中的字符打印 汇编语言程序设计
4.显示字符串(功能调用号9) 调用格式:LEA DX,字符串偏移地址 MOV AH,9 INT 21H 功能:将当前数据区中DS:DX所指向的以‘$’结尾的字符串送 屏幕显示。 注:若字符串中包含字符串‘$’,则不能采用本调用,只能循环 地使用2号调用。 例:DATA SEGMENT BUF DB ‘HOW DO YOU DO?$’ DATA ENDS : LEA DX,BUF MOV AH,9 INT 21H 输出字符串HOW DO YOU DO? 汇编语言程序设计
5.键盘输入字符串:(功能调用号:10(或0AH))5.键盘输入字符串:(功能调用号:10(或0AH)) 调用格式:LEA DX,存放字符串的首偏移地址 MOV AH,10 INT 21H 功能:从键盘上往DS:DX所指的输入缓冲区输入以回车键结束 的字符串,并送显示器显示。 对缓冲区的要求: 例如: BUF DB 80 DB ? DB 80 DUP(0) ;第一个字节存放缓冲区大小,不能 为0,用户确定 ;第二个字节存放实际输入的字符个数, 系统填入 ;从键盘上输入字符串从第三个字节存 放(如果超过则多余去掉,响铃告警) 汇编语言程序设计
举例:编程完成 (1)在屏幕上显示一行提示信息:“WHAT IS YOUR NAME?” (2)接受用户从键盘输入的信息,并存入内存缓冲区 S:MOV AX,DATA MOV DS,AX LEA DX,M MOV AH,9 INT 21H MOV DX,0FFSET P MOV AH,10 INT 21H MOV AH,4CH INT 21H CODE ENDS END S DATA SEGMENT P DB 100 DB ? DB 100 DUP(?) M DB ‘WHAT IS YOUR NAME?$’ DATA ENDS STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK 汇编语言程序设计
上机题 (1)从键盘上接受一个小号字母,将它变成对应大写字母并显示。 (2)从键盘上接受一个字符,显示它的前导字符和后继字符。 汇编语言程序设计
汇编程序上机过程及操作 一.上机环境及过程 1.环境: 必须准备下列软件: 操作系统:DOS(或UC-DOS) 编辑程序:WORDSTAR或SIDEKICK或TRURBO,EDIT等之一。 宏汇编程序:MASM.EXE,CREF 连接程序:LINK.EXE 调试程序:DEBUG.COM 库管理程序:LIB 2.过程 编辑TC产生 .ASM文件 宏汇编MASM 产生.OBJ文件 连接LINK 产生.EXE 调试DEBUG .EXE DOS下运行 .EXE 错 错 错 汇编语言程序设计