汇编语言第4章程序设计_第1页
汇编语言第4章程序设计_第2页
汇编语言第4章程序设计_第3页
汇编语言第4章程序设计_第4页
汇编语言第4章程序设计_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第4 4章章汇编语言程序设计主要内容n汇编语言源程序的结构汇编语言源程序的结构n汇编语言语句格式汇编语言语句格式n伪指令伪指令n功能调用功能调用n汇编语言程序设计汇编语言程序设计4.1 汇编语言源程序了解:了解:n汇编语言源程序的结构汇编语言源程序的结构n汇编语言语句类型及格式汇编语言语句类型及格式一、汇编语言源程序结构1. 汇编语言源程序与汇编程序n汇编语言源程序汇编语言源程序n汇编程序汇编程序用助记符编写用助记符编写汇编程序汇编程序汇编语言汇编语言源程序源程序机器语言机器语言目标程序目标程序源程序的编译程序源程序的编译程序2. 汇编语言程序设计与执行过程编辑编辑文本编辑器,如文本编辑器,

2、如 EDIT.COMEDIT.COM源程序:文件名源程序:文件名.asm.asm汇编汇编汇编程序,如汇编程序,如 ML.EXEML.EXE目标模块:文件名目标模块:文件名.obj.obj连接连接连接程序,如连接程序,如 LINK.EXELINK.EXE可执行文件:文件名可执行文件:文件名.exe.exe调试调试调试程序,如调试程序,如 CodeViewCodeView应用程序应用程序错误错误错误错误错误错误错误错误3. 汇编语言源程序结构数据段名数据段名 SEGMENTSEGMENT 数据段名数据段名 ENDSENDS附加段名附加段名 SEGMENTSEGMENT 附加段名附加段名 ENDSE

3、NDS堆栈段名堆栈段名 SEGMENTSEGMENT 堆栈段名堆栈段名 ENDSENDS代码段名代码段名 SEGMENTSEGMENT 代码段名代码段名 ENDSENDS END END 一个完整源程序结构DSEG SEGMENTDSEG SEGMENT DATA1 DB 1DATA1 DB 1,2 2, 3 DUP 3 DUP(?)(?) DATA2 DW 1234H DATA2 DW 1234HDSEG ENDSDSEG ENDSESEG SEGMENTESEG SEGMENT DB 20 DUPDB 20 DUP(?)(?)ESEG ENDSESEG ENDSSSEG SEGMENT S

4、TACK STACKSSEG SEGMENT STACK STACK DB 200 DUPDB 200 DUP(?)(?)SSEG ENDSSSEG ENDS CSEG SEGMENTCSEG SEGMENT ASSUME CS ASSUME CS:CSEGCSEG,DSDS:DSEGDSEG,ESES:ESEGESEG,SSSS:SSEGSSEG START START:MOV AXMOV AX,DSEGDSEG MOV DS MOV DS,AXAX MOV AX MOV AX,ESEGESEG MOV ES MOV ES,AXAX MOV AX MOV AX,SSEGSSEG MOV SS

5、 MOV SS,AXAX CSEG ENDS CSEG ENDS END STARTEND START源程序源程序 代码代码段寄存器初始化段寄存器初始化将段地址送将段地址送相应的段寄存器相应的段寄存器【例例】编写一个两个字相加的程序编写一个两个字相加的程序DSEG SEGMENT DSEG SEGMENT ;定义数据段定义数据段DATA1 DW 1234H DATA1 DW 1234H ;定义被加数定义被加数DATA2 DW 5678H DATA2 DW 5678H ;定义加数定义加数DSEG ENDS DSEG ENDS ;数据段结束数据段结束ESEG SEGMENT ESEG SEGMEN

6、T ;定义附加段定义附加段SUM DW 2 DUPSUM DW 2 DUP(?)(?) ;定义存放结果区定义存放结果区ESEG ENDS ESEG ENDS ;附加段结束附加段结束CSEG SEGMENT CSEG SEGMENT ;定义代码段定义代码段10;下面的语句说明程序中定义的各段分别用哪个段寄存器寻址;下面的语句说明程序中定义的各段分别用哪个段寄存器寻址ASSUME CSASSUME CS:CSEGCSEG,DSDS:DSEGDSEG,ESES:ESEGESEGSTARTSTART: MOV AXMOV AX,DSEG DSEG ;STARTSTART为程序开始执行的启动标号为程序开

7、始执行的启动标号 MOV DS MOV DS,AX AX ;初始化初始化DSDS MOV AX MOV AX,ESEGESEG MOV ES MOV ES,AX AX ;初始化初始化ESES LEA SI LEA SI,SUM SUM ;存放结果的偏移地址送存放结果的偏移地址送SISI MOV AX MOV AX,DATA1 DATA1 ;取被加数取被加数 ADD AX ADD AX,DATA2 DATA2 ;两数相加两数相加 MOV ES MOV ES:SISI,AX AX ;和送附加段的和送附加段的SUMSUM单元中单元中 HLT HLTCSEG ENDS CSEG ENDS ;代码段结束

8、代码段结束 END START END START ;源程序结束源程序结束11二、汇编语言语句类型及格式二、汇编语言语句类型及格式1. 汇编语言语句类型指令性语句指令性语句指示性语句指示性语句CPU执行的语句,能够执行的语句,能够生成目标代码生成目标代码CPU不执行,而由汇编不执行,而由汇编程序执行的语句,不生程序执行的语句,不生成目标代码成目标代码2. 汇编语言语句格式 指令性语句:指令性语句: 标号:标号: 前缀前缀 助记符助记符 操作数操作数,操作数操作数 ;注释;注释指令的符号地址指令的符号地址标号后要有冒号标号后要有冒号操作码操作码注释前加分号注释前加分号LOOPERLOOPER:

9、MOVMOV AL AL,SI SI ;将;将SISI所指向的内容赋给所指向的内容赋给ALAL标号有三种属性:段、偏移量和类型。标号有三种属性:段、偏移量和类型。 标号的标号的段属性段属性是定义标号在程序段的段地址,当程序中引是定义标号在程序段的段地址,当程序中引用一个标号时,该标号的段值应在用一个标号时,该标号的段值应在CSCS寄存器中。寄存器中。 标号的标号的偏移量偏移量属性表示标号所在段的起始地址到定义该标属性表示标号所在段的起始地址到定义该标号的地址之间的字节数。偏移量是一个号的地址之间的字节数。偏移量是一个1616位无符号数。位无符号数。 标号的类型属性有两种:标号的类型属性有两种:

10、NEARNEAR和和FARFAR。前一种标号可以在。前一种标号可以在段内被引用;后一种标号可以在其它段被引用。段内被引用;后一种标号可以在其它段被引用。15指示性语句格式名字名字 伪指令助记符伪指令助记符 操作数操作数 ,操作数,操作数, ;注释;注释变量的符号地址变量的符号地址其后不加冒号其后不加冒号指示性语句中至指示性语句中至少有一个操作数少有一个操作数DATA1 DATA1 DBDB 0F8H 0F8H,60H60H,0ACH0ACH ;定义含有;定义含有3 3个元素的字节变量个元素的字节变量3. 操作数寄存器寄存器存储器单元存储器单元常量常量变量或标号变量或标号表达式表达式常 量n数字

11、常量数字常量: :以字母以字母A AF F开头的十六进制数,前面开头的十六进制数,前面要用要用0 0表达,以避免与其他符号混淆表达,以避免与其他符号混淆。n字符串常量字符串常量: :用单引号引起的字符或字符串用单引号引起的字符或字符串n例:例:A A nMOV AL,An例:例:ABCD汇编时被译成对应的汇编时被译成对应的ASCII码码常量并不被分配内存空间,因为存储在内存空间中的内容是可变的变 量n代表内存中的数据区,程序中视为存储器代表内存中的数据区,程序中视为存储器操作数操作数n变量的属性:变量的属性: 变量所在段的段地址变量所在段的段地址 变量单元地址与段首地址之变量单元地址与段首地址

12、之 间的位移量。间的位移量。 字节型、字型和双字型字节型、字型和双字型段段 值值偏移量偏移量类类 型型变量定义格式:变量定义格式: DB/DW/DD/DQ/DTDB/DW/DD/DQ/DT 20变量空间分配变量空间分配:变量与常量不同,汇编程序会给变量被分配存储空间,EQU定义的常量则不占用存储空间。 例1:某个数据段为:DATA SEGMENTDATA SEGMENTS1S1DB 0,?,?,22DB 0,?,?,22S2S2DB DB 123123COUNTCOUNT EQU $EQU $S1S1NBNBDB 2 DUP(?)DB 2 DUP(?)NWNWDW 120,-100DW 120

13、,-100ASASDW S2 ;DW S2 ;用地址表达式定义变量B3B3DB 2 DUP(2),1 UP(11,DB 2 DUP(2),1 UP(11,A A),16H),16HDATADATAENDSENDS$汇编地址计数器,记录当前汇编地址,Count的值为7注意变量的偏移地变量的偏移地址址和变量的值变量的值两者的区别,且变量一旦定义,则有类型有类型变量名 偏移地址 变量的值 S1 0000H 00H S2 0004H 31H NW 0009H 0078H表达式算术运算算术运算逻辑运算逻辑运算*关系运算关系运算取值运算和属性运算取值运算和属性运算其它运算其它运算算术运算和逻辑运算符n算术

14、运算符算术运算符n+,-,*,/,MODn逻辑运算符逻辑运算符nAND,OR,NOT,XORn例:例:nMOV AL,8 AND 4nMOV AL,8+4-1取值运算符取得其后变量或标号的偏移地址取得其后变量或标号的偏移地址取得其后变量或标号的段地址取得其后变量或标号的段地址TYPE 取取LENGTH 取所定义存储区的长度取所定义存储区的长度SIZE 取所定义存储区的字节数取所定义存储区的字节数n用于分析存储器操作数的属性用于分析存储器操作数的属性n获取变量的属性值获取变量的属性值OFFSETSEGnType Type 返回值:返回值:(1 1)对于变量有对于变量有3 3种。种。 1 1:字节

15、型;字节型; 2 2:字型;字型;4 4:双字型双字型; ;(2 2)对于标号有对于标号有2 2种:种:1 1:NEARNEAR(段内)(段内)2 2:FARFAR(段间)(段间)24取值运算符例 MOV AXMOV AX,SEG DATASEG DATA MOV DS MOV DS,AXAX MOV BX MOV BX,OFFSET DATAOFFSET DATA LEA BX LEA BX,DATADATA等价于等价于取值运算符例n若若BUFFER存储区用如下伪指令定义:存储区用如下伪指令定义: BUFFER DW 200 DUP(0)BUFFER DW 200 DUP(0) 则:则: T

16、YPETYPE BUFFER BUFFER 等于等于2 2 LENGTH BUFFERLENGTH BUFFER等于等于200200 SIZE BUFFERSIZE BUFFER等于等于400400注意:SIZELENGTHTYPE属性运算符n 用于指定其后存储器操作数的类型用于指定其后存储器操作数的类型n 运算符:运算符:PTRn 例:例: MOV BYTR PTRBX,12H其它运算符n方括号:方括号: n段重设符段重设符 段寄存器名:段寄存器名: 方括号中内容为操作数的偏移地址方括号中内容为操作数的偏移地址用于修改默认的段基地址用于修改默认的段基地址29上述运算符和操作符构成表达式时的优

17、先级:()、 、LENGTH、SIZE、WIDTH、MASK;PTR、OFFSTE、SEG、TYPE、THIS、段操作符;HIGH、LOW; *、/、MOD、SHL、SHR; +、-; EQ、NE、LT、LE、GT、GE; NOT; AND、OR、XOR; SHORT低低高高从左到右顺序运算从左到右顺序运算4.2 伪指令掌握:掌握:n伪指令的格式及实现的操作伪指令的格式及实现的操作n伪指令的应用伪指令的应用伪指令n由汇编程序执行的由汇编程序执行的“指令系统指令系统”n作用:作用:n定义变量;定义变量;n分配存储区分配存储区n定义逻辑段;定义逻辑段;n指示程序开始和结束;指示程序开始和结束;n定

18、义过程等。定义过程等。常用伪指令数据定义伪指令数据定义伪指令符号定义伪指令符号定义伪指令段定义伪指令段定义伪指令结束伪指令结束伪指令过程定义伪指令过程定义伪指令宏命令伪指令宏命令伪指令一、数据定义伪指令n用于定义数据区中变量的类型及大小用于定义数据区中变量的类型及大小n格式:格式: 变量名变量名 伪指令助记符伪指令助记符 操作数,操作数, ;注释注释符号地址符号地址定义变量类型定义变量类型定义变量值定义变量值及区域大小及区域大小1. 数据定义伪指令助记符nDB DB 定义的变量为字节型定义的变量为字节型nDW DW 定义的变量为字类型(双字节)定义的变量为字类型(双字节)nDD DD 定义的变

19、量为双字型(定义的变量为双字型(4 4字节)字节)nDQ DQ 定义的变量为定义的变量为4 4字型(字型(8 8字节)字节)nDT DT 定义的变量为定义的变量为1010字节型字节型数据定义伪指令例nDATA1 DB 11HDATA1 DB 11H,22H22H,33H33H,44H44HnDATA2 DW 11HDATA2 DW 11H,22H22H,3344H3344HnDATA3 DD 11HDATA3 DD 11H* *2 2,22H22H,33445566H33445566H以上变量在内存以上变量在内存中的存放形式中的存放形式数据定义伪指令例_变量在内存中的分布变量在内存中的分布DA

20、TA111223344DATA2224411000033DATA32200220000XX66554433数据定义伪指令的几点说明n伪指令的性质决定所定义变量的类型;伪指令的性质决定所定义变量的类型;n定义字符串必须用定义字符串必须用DBDB伪指令伪指令n例:例: DATA1 DB ABCDDATA1 DB ABCD,66H66HABCD41H42H43H44H66H2. 重复操作符n作用:作用:n为一个数据区的各单元设置相同的为一个数据区的各单元设置相同的初值初值n目的:目的:n常用于声明一个数据区常用于声明一个数据区n格式:格式: 变量名变量名 伪指令助记符伪指令助记符 n DUP(初值,

21、初值,)n例:例:M1 DB 10 DUP(0)3. “?”的作用n表示随机值,用于预留存储空间表示随机值,用于预留存储空间nMEM1 DB 34HMEM1 DB 34H,AA,?,? DW 20 DUP DW 20 DUP(?)(?)预留预留40个字节单元,每单元为随机值个字节单元,每单元为随机值随机数随机数占占1个字节单元个字节单元数据定义伪指令例nM1 DB How are you?M1 DB How are you?nM2 DW 3 DUP(11H)M2 DW 3 DUP(11H),3344H3344H DB 4 DUPDB 4 DUP(?)(?)nM3 DB 3 DUPM3 DB 3

22、 DUP(22H22H,11H11H,?),?)变量在内存中的分区变量在内存中的分区数据定义伪指令例M1How aM211H11H00H44H33H r e you?11H00H00H随机数随机数M311H22H11H22H11H22HXXXXXXXXXXXXXX二、符号定义伪指令n格式:格式: 符号名符号名 EQU EQU 表达式表达式 等价于等价于 符号名符号名 = = 表达式表达式 n操作:操作: 用符号名取代后边的表达式,不可重新定义用符号名取代后边的表达式,不可重新定义n例:例: CONSTANTCONSTANTEQUEQU100100 VAR EQU 30H+99HVAR EQU

23、30H+99HEQU说明的表达式不占用内存空间说明的表达式不占用内存空间三、段定义伪指令n说明逻辑段的起始和结束;说明逻辑段的起始和结束;n说明不同程序模块中同类逻辑段之间的联系形说明不同程序模块中同类逻辑段之间的联系形 态态段定义伪指令格式段名段名 SEGMENT SEGMENT 定位类型定位类型 组合类型组合类型 类别类别 段名段名 ENDSENDS说明逻辑说明逻辑段的起点段的起点说明不同模块中同名说明不同模块中同名段的组和连接方式段的组和连接方式段名 SEGMENT 段名 ENDS只需要掌握这种形式定位类型nPARAPARA:段的起点从节边界开始(段的起点从节边界开始(1616个字节为个

24、字节为1 1节)节) 段的起始地址应为:段的起始地址应为:XXXX0HXXXX0H(被(被1616整除)整除)nBYTEBYTE:段的起点从存储器任何地址开始(字节边段的起点从存储器任何地址开始(字节边 界开始)界开始)nWORDWORD:段的起点从偶地址开始(字边界开始)段的起点从偶地址开始(字边界开始)nPAGEPAGE:段的起点从页边界开始(段的起点从页边界开始(256256个字节为个字节为1 1页)页) 段的起始地址应为:段的起始地址应为:XXX00HXXX00H(被(被256256整除)整除)组合类型n与其它模块中的同名段在满足定位类型的前提与其它模块中的同名段在满足定位类型的前提

25、下具有的组合方式:下具有的组合方式:nNONENONE: 不组合不组合nPUBLICPUBLIC: 依次连接(顺序由依次连接(顺序由LINKLINK程序确定)程序确定)nCOMMONCOMMON: 覆盖连接覆盖连接nSTACKSTACK: 堆栈段的依次连接堆栈段的依次连接nAT AT 表达式:段定义在表达式值为段基的节边界表达式:段定义在表达式值为段基的节边界nMEMORYMEMORY: 相应段在同名段的最高地址处。相应段在同名段的最高地址处。类别n不同模块连接时将相同类别的段放在连不同模块连接时将相同类别的段放在连续的内存区域中续的内存区域中段定义伪指令例DATA SEGMENT DATA

26、SEGMENT MEM1 DB 11H MEM1 DB 11H,22H22H MEM2 DB Hello MEM2 DB Hello! MEM3 DW 2 DUPMEM3 DW 2 DUP(?)(?)DATA ENDSDATA ENDS变量在逻辑段变量在逻辑段中的位置就代中的位置就代表了它的偏移表了它的偏移地址地址表示变量所在表示变量所在逻辑段的段地逻辑段的段地址址表示变量的类表示变量的类型型四、设定段寄存器伪指令n说明所定义逻辑段的性质说明所定义逻辑段的性质n格式:格式: ASSUME 段寄存器名段寄存器名:段名段名,段寄存器名,段寄存器名:段名,段名,五、结束伪指令n表示源程序结束表示源程

27、序结束n格式:格式: END 标号标号六、过程定义伪指令n用于定义一个过程体用于定义一个过程体n格式:格式: 过程名过程名 PROC NEAR / FAR RET 过程名过程名 ENDPP157例例过程入口的过程入口的符号地址符号地址过程定义及调用例n定义延时子程序定义延时子程序 nDELAY PROCn PUSH BXn PUSH CXn MOV BL,2nNEXT: MOV CX,4167nW10M: LOOP W10Mn DEC BLn JNZ NEXTn POP CXn POP BXn RETnDELAY ENDPn调用延时子程序:调用延时子程序: nCALL DELAY 七、宏命令伪

28、指令n 源程序中由汇编程序识别的具有独源程序中由汇编程序识别的具有独 立功能的一段程序代码立功能的一段程序代码n格式:格式: 宏命令名宏命令名 MACRO ENDM宏体宏体宏宏八、其它伪指令 段内程序代码或变量的起始偏移地址段内程序代码或变量的起始偏移地址n格式:格式: ORG 表达式表达式n例:例: ORG 2000H计算值为计算值为非负常数非负常数ORGORG可置于代码段、数据段的任何地方无ORG时则从偏移地址为0000H开始存放代码和数据55【例】给汇编地址计数器(指针)赋值 DATA SEGMENT ORG 10;置值为10 VAR1 DW 100H,200H ORG +5 ;置的值为

29、14+5,即为19 VAR2 DB 1,2, +1,+2 N EQU -VAR2 ;=23 DATAENDS注:$表示当前汇编地址指针的值。其它伪指令nNAME-NAME-为目标程序设定一个名字为目标程序设定一个名字n格式:格式: NAME NAME 模块名模块名nTITLE-TITLE-为程序清单指定打印标题为程序清单指定打印标题n格式:格式: TITLE TITLE 标题名标题名n.8086-.8086-汇编程序将在汇编程序将在8086808680888088方式下操作方式下操作n.386-.386-汇编程序将在汇编程序将在8038680386方式下操作方式下操作4.3 功能调用DOS 功

30、能调用功能调用 BIOS功能调用功能调用DOS 功能调用n包含多个子功能的功能包;包含多个子功能的功能包;n用软中断指令调用,中断类型码固定为用软中断指令调用,中断类型码固定为2121H H;n各子功能采用功能号来区分。各子功能采用功能号来区分。DOS 功能调用设备设备管理管理DOS 功能调用n调用格式:调用格式: MOV AHMOV AH,功能号功能号 INT 21HINT 21H一、单字符输入l 键盘输入单字符(1号调用)格式:MOV AH,1 INT21H功能:等待键盘输入,输入字符的ASCII码送入AL寄存器,并在显示器上显示该字符。例:例:程序中有时需要用户对提示做出应答。程序中有时

31、需要用户对提示做出应答。 GET_KEY: GET_KEY: MOV AH,1MOV AH,1 ; ;等待键入字符等待键入字符 INT 21HINT 21H; ;结果在结果在ALAL中中 CMP AL,Y ;CMP AL,Y ;是是Y?Y? JZ YES JZ YES ; ;是是, ,转转YESYES CMP AL,N ; CMP AL,N ;是是N?N? JZ NO JZ NO ; ;是是, ,转转NONO JMP GET_KEY ; JMP GET_KEY ;否则继续等待输入否则继续等待输入 YES:YES: NO: NO: 无入口参数;无入口参数;执行时系统等待键执行时系统等待键盘输入,

32、若键入盘输入,若键入Ctrl-Ctrl-BreakBreak,则退出,则退出; ;功能号功能号7 7和和8 8也可接也可接收键盘输入的单字符,收键盘输入的单字符,但无回显。但无回显。单字符输入例GET_KEY:GET_KEY: MOVMOVAH,1AH,1 INTINT21H21H CMPCMPAL,AL,Y Y JZ JZ YESYES CMP CMPAL,AL,N N JZ JZ NONO JMP JMPGET_KEYGET_KEY YES: YES: NO: NO: 交互式应交互式应 答程序答程序二、字符串输入n注意问题:注意问题:n调用格式调用格式n字符输入缓冲区的定义字符输入缓冲区的

33、定义1. 调用格式 功能号功能号OAHOAH 字符串在内存中的存放地址字符串在内存中的存放地址nINT 21HINT 21Hn AHn DS:DX2.键盘输入字符串(0A号调用)格式:格式:MOV AHMOV AH,0AH0AHLEA DX, LEA DX, INTINT21H21H功能:功能:等待键盘输入,输入字符串的等待键盘输入,输入字符串的ASCIIASCII码送内存单元。码送内存单元。(预留的预留的N1个字节的存储单元个字节的存储单元) 0DHN2N1 N1: 缓冲区长度缓冲区长度(最大键入字符数最大键入字符数), N2: 实际键入的字符数实际键入的字符数(不包括回车符不包括回车符)

34、例:设在数据段定义键盘缓冲区如下:例:设在数据段定义键盘缓冲区如下: STR1 DB 10,?,10 DUP(?) ;程序段:;程序段: LEA DX,STR1 MOV AH,0AH INT 21H ;最多从键盘接收10个按键缓冲区缓冲区格式格式:注意:先定义一个缓冲区;最后输入回车键以示字符串输入结束:未先定义一个缓冲区;最后输入回车键以示字符串输入结束:未填满,剩余填零;超过缓冲区容量,自动丢失并响铃。填满,剩余填零;超过缓冲区容量,自动丢失并响铃。输入字符串程序段n DAT1 DB 20 DAT1 DB 20,?,?,20 DUP20 DUP(?)(?) n LEA DXLEA DX,D

35、AT1DAT1 MOV AH MOV AH,0AH0AH INT 21H INT 21H在数据段在数据段中定义中定义输入缓冲区14H ?20个字节个字节定义后的输入缓冲定义后的输入缓冲区初始状态:区初始状态:三、单字符显示输出 功能号功能号O2HO2H 待输出字符待输出字符nINT 21HINT 21H将将DLDL寄存器中的字符在显示器上显示,如果寄存器中的字符在显示器上显示,如果要退出按要退出按CTRLCTRL+ +BREAKBREAKn AHn DL单字符显示输出例nMOVMOVAHAH,0202nMOVMOVDLDL,41H41HnINTINT21H21H执行结果:执行结果:屏幕显示屏幕

36、显示A四、字符串输出显示 功能号功能号O9H 待输出字符串的偏移地址待输出字符串的偏移地址nINT 21Hn AHn DS:DX被显示的字符串必须以被显示的字符串必须以$ $结束结束, ,且所显示且所显示的内容不应出现非可见的的内容不应出现非可见的ASCIIASCII码码字符串输出显示例DATADATASEGMENTSEGMENT MESS1 DB Input String:, 0DH MESS1 DB Input String:, 0DH,0AH,$0AH,$ DATA ENDS DATA ENDSCODE SEGMENTCODE SEGMENT MOVMOVAHAH,0909MOVMOVD

37、XDX,OFFSET MESS1OFFSET MESS1INTINT21H21H 格式:格式:MOV AHMOV AH,4CH4CH INTINT 21H 21H功能:终止当前程序并返回调用程序功能:终止当前程序并返回调用程序( (操作系统操作系统) )。72五、返回操作系统(4CH号调用)73【例例】编写程编写程序完成在屏序完成在屏幕上显示字幕上显示字符串符串“Example Example of string of string displaydisplay!” ” DATA SEGMENTSTRDB 0DH,0AH,Example of string display!DATA ENDS;

38、定义了数据段,0DH回车符ASCII码、0AH换行符ASCII码STACK SEGMENT PARA STACK STACK DB 100 DUP(0)STACK ENDS;定义了堆栈段,本程序没使用定义的堆栈段CODE SEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKBEGIN:MOVAX ,DATAMOVDS,AXLEADX,STRMOVAH ,9INT21HMOVAH,4CH INT21HCODEENDSEND BEGIN【例】编写程序完成从键盘上输入一字符串到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。 解题思路:解题思路:(1)先按先按0AH号

39、、号、9号功能要求定义输入输出缓冲区;号功能要求定义输入输出缓冲区;(2)调用调用0AH号功能输入字符串到号功能输入字符串到BUFA缓冲区;缓冲区;(3)通过一段循环程序将输入缓冲区的字符按相反顺序传送通过一段循环程序将输入缓冲区的字符按相反顺序传送到输出缓冲区到输出缓冲区BUFB中;中;(4)通过调用通过调用9号系统功能显示输出。号系统功能显示输出。DATA SEGMENTINFO1 DB 0DH,0AH,INPUT STRING:INFO2 DB 0DH,0AH,OUTPUT STRING:BUFADB81DB?DB80 DUP(0) ORG $+10 BUFBDB81 DUP(0)DAT

40、AENDS;定义数据段,安排提示信息、输入输出数据区STACK SEGMENT PARA STACK STACKDB 200 DUP(0)STACK ENDS;定义数据段CODE SEGMENTASSUME DS: DATA, SS: STACK, CS: CODESTART:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AXLEA DX,INFO1MOV AH,9INT 21H;9号功能调用,显示输入提示信息LEA DX,BUFA ;输入字符串缓冲区首地址送DXMOV AH,10;0AH号功能调用,功能号送AH寄存器INT 21H LEA SI,BUFA

41、+1MOV CH,0MOV CL,SI ;取字符长度CXADD SI,CX;SI为源数据指针指向字符串尾部LEA DI,BUFB ;DI为目的数据指针,首地址BUFBNEXT:MOV AL,SIMOV DI,ALDEC SIINC DILOOP NEXTMOV BYTE PTR DI,LEA DX,INFO2MOV AH,9INT 21H ;显示提示信息LEA DX,BUFBMOV AH,9INT 21H ;反显输入字符串MOV AH,4CH ;返回DOSINT 21HCODE ENDSEND START4.4源程序两种格式书写v第一种格式从第一种格式从MASM 5.0开始支持开始支持n简化段

42、定义格式简化段定义格式v第二种格式第二种格式MASM 5.0以前就具有以前就具有n完整段定义格式完整段定义格式Hello, Everybody !程序功能程序功能;lt301a.asm;lt301a.asm(文件名)(文件名).model small.model small; ;定义程序的存储模式定义程序的存储模式.stack.stack; ;定义堆栈段定义堆栈段.data.data; ;定义数据段定义数据段stringstringdb Hello, Everybody !,0dh,0ah,$db Hello, Everybody !,0dh,0ah,$; ;在数据段定义要显示的字符串在数据段

43、定义要显示的字符串.code.code; ;定义代码段定义代码段.startup.startup; ;程序起始点,建立程序起始点,建立DSDS、SSSSmov dx,offset stringmov dx,offset string; ;指定字符串指定字符串mov ah,9mov ah,9int 21hint 21h; ;利用功能调用显示信息利用功能调用显示信息.exit 0.exit 0; ;程序结束点,返回程序结束点,返回DOSDOSendend; ;汇编结束汇编结束简化段定义格式简化段定义格式;SampleA.ASM;SampleA.ASM.model small.model small

44、.stack.stack.data.data.; ;在数据段定义数据在数据段定义数据.code.code.startup.startup.; ;在代码段填入指令序列在代码段填入指令序列.exit 0.exit 0.; ;子程序代码子程序代码endend简化段定义格式 MASM 6.x支持;SampleC.ASM;SampleC.ASM.model small.model small.stack.stack.data.data.; ;在数据段定义数据在数据段定义数据.code.codestartstart:mov ax,datamov ax,datamov ds,axmov ds,ax.; ;在

45、代码段填入指令序列在代码段填入指令序列mov ax,4c00hmov ax,4c00hint 21hint 21h.; ;子程序代码子程序代码end startend start简化段定义格式 MASM 5.x支持; ;lt301b.asmlt301b.asm(文件名)(文件名)stackstacksegment stacksegment stack; ;定义堆栈段定义堆栈段dw 512 dup(?)dw 512 dup(?); ;堆栈段有堆栈段有512512字(字(10241024字节)空间字节)空间stackstackendsends; ;堆栈段结束堆栈段结束datadatasegment

46、segment; ;定义数据段定义数据段stringstring db db Hello, Everybody !Hello, Everybody !,0dh,0ah,0dh,0ah,$ $datadataendsendscodecodesegment segment codecode ; ;定义代码段定义代码段assume cs:code,ds:data,ss:stackassume cs:code,ds:data,ss:stackstart:start: mov ax,datamov ax,data; ;建立建立DSDS段地址段地址mov ds,axmov ds,ax完整段定义格式完整段定

47、义格式mov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21hmov ax,4c00hmov ax,4c00hint 21hint 21h; ;利用功能调用返回利用功能调用返回DOSDOScodecodeendsends; ;代码段结束代码段结束end startend start; ;汇编结束,同时指明程序起始点汇编结束,同时指明程序起始点完整段定义格式完整段定义格式;SampleB.ASM;SampleB.ASMstackstacksegment stacksegment stackdw 512 dup(?

48、)dw 512 dup(?)stackstackendsendsdatadatasegmentsegment.; ;在数据段定义数据在数据段定义数据datadataendsendscodecodesegment segment codecodeassume cs:code,ds:data,ss:stackassume cs:code,ds:data,ss:stackstart:start: mov ax,datamov ax,datamov ds,axmov ds,ax.; ;在代码段填入指令序列在代码段填入指令序列mov ax,4c00hmov ax,4c00hint 21hint 21h.

49、; ;子程序代码子程序代码codecodeendsendsend startend start完整段定义格式 MASM 5.x支持4.5 汇编语言程序设计设计步骤:设计步骤:n根据实际问题抽象出数学模型根据实际问题抽象出数学模型n确定算法确定算法n画程序流程图画程序流程图 n分配内存工作单元和寄存器分配内存工作单元和寄存器n程序编码程序编码n调试调试程序流程图符号起始:起始:功能:功能:判断:判断:子过程:子过程:汇编语言程序结构n顺序结构顺序结构n循环结构循环结构n先判定型先判定型n后判定型后判定型n分支结构分支结构n单分支单分支n多分支多分支顺序结构程序顺序结构程序 什么是顺序结构程序?什

50、么是顺序结构程序?【例例】已知某班学生的英语成绩按学号(从已知某班学生的英语成绩按学号(从1 1开始)从小开始)从小到大的顺序排列在到大的顺序排列在TABTAB表中,要查的学生的学号放在变表中,要查的学生的学号放在变量量NONO中,查表结果放在变量中,查表结果放在变量ENGLISHENGLISH中。试编写程序实中。试编写程序实现成绩查询。现成绩查询。分析:分析:1,建立数据表,建立数据表,BX TAB偏移地址偏移地址2,学号,学号NO 值送值送AL3、查表:、查表:AL BX+AL5、返回操作系统,使用、返回操作系统,使用DOS功能调用功能调用MOV AH,4CHINT 21HDATA SEG

51、MENTTAB DB 80,85,86,90,88,98,78,86,65NO DB 6ENGLISH DB ?DATAENDS;定义数据段,成绩表、学号、成绩STACK SEGMENT PARA STACK STACKDB 200 DUP(0)STACK ENDS;定义数据段CODE SEGMENTASSUME DS: DATA, SS: STACK, CS: CODEBEGIN:MOV AX,DATA MOV DS,AX LEA BX,TAB MOV AL,NO DEC AL XLAT MOV ENGLISH,AL MOV AH,4CH INT 21HCODE ENDS END BEGIN

52、顺序结构程序顺序结构程序思考:程序运行时改为有键盘输入学号,会改程序吗?程序运行时改为有键盘输入学号,会改程序吗?分析:分析:1、建立数据表,、建立数据表,BX TAB偏移地址偏移地址 2、键盘输入学号送、键盘输入学号送AL,使用,使用DOS功能调用功能调用 3、将键盘输入的字符转换为数字、将键盘输入的字符转换为数字 4、查表:、查表:AL BX+AL 5、返回操作系统,使用、返回操作系统,使用DOS功能调用功能调用MOV AH,01HINT 21H ;键盘输入的数据送键盘输入的数据送ALMOV AH,4CHINT 21HAND AL, 0FH ;个位;个位学号是两位数学号是两位数如何处理?如

53、何处理?(十位、个位)(十位、个位)分支结构程序分支结构程序 分支结构程序也称条件结构,根据不同条件转移到不同程序段执行相关分支程序。有两个分支和多个分支。【例例】:编写计算下面函数值的程序:编写计算下面函数值的程序: 1 ;X0Y= 0 ;X=0 -1 ;X0设输入数据为设输入数据为X、输、输出数据出数据Y,皆为字节,皆为字节变量。程序流程图变量。程序流程图如右图所示。如右图所示。DATASEGMENTX DB -10;定义数据段,假设x值为-10Y DB ?;给函数值y预留一个单元DATAENDSSSEG SEGMENT PARA STACK STACKDB 200 DUP(0)SSEG

54、ENDSCODESEGMENTASSUME DS:DATA,SS:SSEG,CS:CODESTART:MOV AX,DATAMOV DS,AXMOV AX,SSEGMOV SS,AXCMP X,0;与0进行比较JGE A1;X0转A1MOV Y,-1;X 0时,-1YJMP EXITA1:JG A2;X0转A2MOV Y,0;X=0时,0YJMP EXITA2:MOV Y,1EXIT: MOV AH,4CHINT 21H CODEENDSEND START分支结构程序分支结构程序【例】:在DATA1开始的连续80个单元中存放80位同学某门课的考试成绩(0100)请编程序统计大于等于90,8089分,7079分,6069分,小于60分的人数,分别放在同一数据段DATA2开始的5个单元中。 人数送人数送CX;SI指向成绩表指向成绩表DATA1;DI指向指向DATA2取一学生成绩送取一学生成绩送AL 90 90人数加人数加1808970796069对应对应人数加人数加1对应对应人数加人数加1对应对应人数加人数加160人数加人数加1CX减减1送送CXCX=0?结束结束NNNNYYYYYN分支结构程序分支结构程序BUF N 31H 44H 49H41H 36HBUF+1BUF+2【例】 统计统计BUF+1BUF+1开始的开始的N N个字符组成个字符组成的字符串中数字、大写字母、和其它

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论