汇编语言第4章顺序程序设计.ppt

上传人:牧羊曲112 文档编号:6388973 上传时间:2023-10-26 格式:PPT 页数:105 大小:436KB
返回 下载 相关 举报
汇编语言第4章顺序程序设计.ppt_第1页
第1页 / 共105页
汇编语言第4章顺序程序设计.ppt_第2页
第2页 / 共105页
汇编语言第4章顺序程序设计.ppt_第3页
第3页 / 共105页
汇编语言第4章顺序程序设计.ppt_第4页
第4页 / 共105页
汇编语言第4章顺序程序设计.ppt_第5页
第5页 / 共105页
点击查看更多>>
资源描述

《汇编语言第4章顺序程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言第4章顺序程序设计.ppt(105页珍藏版)》请在三一办公上搜索。

1、汇编语言,第四章,第四章汇编语言程序设计,设问:,1为什么要有伪指令?2运算结果怎样显示在屏幕上?3含有键盘输入的程序如何编写?4.完整的汇编语言程序都有哪些要求?5.简化的程序格式是不是更方便?,本章重点,汇编语言程序格式伪指令的用法数值运算程序设计屏幕显示和键盘输入,4.1 汇编语言程序设计初步,举例:编写一个汇编语言程序,实现下列公式计算。假设X=4,Y=5 Z=(XY)8X 2,4.1.1 第1个汇编语言程序,设计思路一:(1)设公式中出现的三个变量X、Y、Z是8位带符号数;(2)用算术运算指令实现加减乘除运算;(3)指令顺序按照运算顺序书写。,程序段:MOV AL,X;ALXADD

2、AL,Y;ALX+Y 加法MOV BL,8;BL8IMUL BL;AXAL8 乘法MOV BL,X;BLXMOV BH,0;BH0SUB AX,BX;AXAXX 减法MOV BL,2;BL2IDIV BL;AX2 除法,商在 AL,余数在AH中MOV Z,AL;Z商MOV Z1,AH;Z1余数,设计思路二:(1)公式中出现的三个变量X、Y、Z是带符号数,在数据段中定义;(2)用算术运算指令实现加减运算;(3)将操作数左移3位二进制位数代替乘以8运算,操作数右移1位相当于除以2;(4)指令在代码段中,指令顺序按照运算顺序书写。,DATA SEGMENT;数据段定义伪指令X DW 4;定义X为字单

3、元,值为4Y DW 5Z DW?;定义Z为空单元DATA ENDS;数据段结束,完整的程序如下:;abc.asm 公式计算,CODE SEGMENT;代码段定义伪指令 ASSUME CS:CODE,DS:DATA;指定段寄存器与对应段名START:MOV AX,DATA MOV DS,AX;将数据段段地址送入DSMOV BX,X MOV AX,YADD AX,BX;加法MOV CL,3SAL AX,CL;算术左移3次,相当于乘以8SUB AX,X;减法SAR AX,1;算术右移1次,相当于除以2MOV Z,AXMOV AH,4CH;此两句为结束程序,返回DOSINT 21H CODE ENDS

4、;代码段结束 END START;整个程序结束伪指令,4.1.2 从源程序到可执行程序,图 汇编语言程序从输入到生成可执行文件过程1建立和生成的文件2汇编环境3上机步骤4调试程序,1建立和生成的文件,(1)用户编写的源程序,源程序名自定、扩展名为.ASM(2)源程序经汇编程序MASM汇编(翻译)后生成二进制目标程序,文件名默认与源程序同名、扩展名为.OBJ(3)目标程序需要经过LINK连接生成可执行程序,文件名默认与源程序同名、扩展名为.EXE,2汇编环境,最基本的汇编环境只需要两个文件:MASM.EXE和LINK.EXE。将这两个文件拷入到已经建好的文件夹(例如HB)中,并将文件夹HB放在硬

5、盘根目录C:下 文本编辑软件可以用EDIT或者“记事本”,3上机步骤,Ccd 退到根目录Ccd hb 进入hb子目录C:hbedit abc.asm 编辑源程序C:hb masm abc.asm 汇编C:hb link abc.obj 连接C:hb abc.exe 执行C:hb debug abc.exe 调试,进入DOS窗口中执行:,4调试程序,-U 反汇编-G 断点 执行程序-D DS:0 查看数据段-Q 退出,进入DEBUG后,执行如下命令:,上机练习:(1)验证举例的设计思路二程序(2)将举例的设计思路一的程序段增加相关的伪指令,修改为可上机执行的程序。,4.2 伪指令,段定义伪操作段

6、定义伪指令ASSUME伪指令,段定义伪指令,段定义伪指令可用来定义各种类型的段。格式如下:段名 SEGMENT 类型参数 段名 ENDSSEGMENT和ENDS必须成对使用,表示段的开始和结束。,类型参数:(1)定位类型PARA 该段的起始地址必须为小段的首地址,即段地址的十六进制数最低位为0BYTE 该段可以从任意地址开始WORD 该段必须从字边界开始,即段的起始地址为偶数DWORD 该段必须从双字边界开始,即段地址的十六进制数最低位应为4的倍数PAGE 该段必须从页边界开始,即段地址的十六进制数最低两位为00(能被256整除)如果不指出定位类型,系统默认为PARA。,(2)组合类型PRIV

7、ATE 该段为私有段,连接时不与其他同名段合并PUBLIC 连接时可与其他模块中的同名段按顺序连接 成一个段COMMON 表示该段与其他模块中的同名段有相同的起 始地址,如果连接将产生覆盖;连接后,段的长度为同名段中的最长者STACK 表示该段为堆栈段AT 表达式 该段直接定位在表达式指出的位置上如果不指定组合类型,系统默认为PRIVATE。(3)类别标识在引号中给出段的类型名,在连接时,类别标识相同的段放在连续的存储区中。例如,用STACK来标识该段为堆栈段,返回,ASSUME伪指令,ASSUME伪指令用于指明段寄存器与段的对应关系,格式为:ASSUME 段寄存器:段名,段寄存器:段名,如果

8、不使用ASSUME伪指令,系统就无法获知用户定义的段都有哪些,进而就不能正确地划分段。,返回,数据定义伪指令格式为:存储单元名 DB(或DW、DD等伪指令)操作数其中:(1)存储单元可以起名也可以不要名字(2)数据定义伪指令DB 定义字节单元DW 定义字单元DD 定义双字单元DQ 定义四字单元DT 定义十字节单元(3)操作数用于指出存储单元的内容即该单元的值。一条数据定义伪指令可以给多个存储单元赋值。需要说明的是确定存储单元的内容时要与存储单元的属性一致。,4.2.2 数据定义伪指令,操作数是常数或表达式,例1 定义字节单元X=56,字单元E_1=2030H,双字单元CARRY=1234567

9、8H DATA SEGMENT X DB 56 E_1 DW 2030H CARRY DD 12345678H DATA ENDS,实际存储显示:,例2 一次定义多个存储单元。字母打头的十六进制数要在前面加0,?代表空单元 XX DB 12,0,0E4H YY DW 5,?,6*3,实际存储显示:,例3 用DUP()子句重复定义相同操作数 AVE DB 8,3 DUP(2),-6MSN DB 5 DUP(?)COUNT DW 100 DUP(1)存储示意:,操作数是字符串,例1 定义字符及字符串,字符串要用引号括起来 MES1 DB A,B MES2 DW AB MES3 DB HELLO,实

10、际存储显示:,4.2.3 其它伪指令,1赋值伪指令 在程序中多次出现同一个表达式时,可以用EQU定义一个符号来代表表达式,以简化书写。与EQU伪操作相似,等号=伪操作也可以给表达式赋值,且允许对一个符号多次重复定义;而EQU则不允许。,例:CONT EQU 125*3.14 STR EQU RIGHT SUM EQU 0 BUFF=56 PASS=2034H BUFF=56H,2模块定义伪指令,在汇编语言中,可以将程序设为多个模块,每个模块完成独立的功能。因此,每个模块可用模块定义伪指令定义名称和结束标识。格式为:NAME 模块名 END 起始标号其中,NAME伪指令可以缺省。如果缺省,则以该

11、模块的源程序名作为模块名。END伪指令不能缺省。其后的起始标号可以是程序的第一条汇编指令的标号START,或者是主过程名。,3地址计数器,地址计数器$表示当前的偏移地址值。如果用在数据段的存储单元定义中,可写成:ABC DW 1,2,$+3,4实际存储显示:如果用在转移指令中:JMP$+5则无条件跳转到当前指令的偏移地址+5单元继续执行。,4设置偏移地址伪指令,当前的偏移地址可以用ORG伪指令定义。如果用在数据段中,该指令可以确定存储单元的偏移地址,例如将X单元的偏移地址定义为0020H,该单元的内容为5,即(DS:0020H)=5。伪指令如下:DATA SEGMENT ORG 0020H X

12、 DW 5DATA ENDS如果用在代码段中,可从指定的单元开始存放并执行指令。,例如从代码段的100H开始执行:ORG 100HSTART:MOV AX,X;标号START设置为100H MOV BX,Y ADD AX,BX,5操作符,在汇编指令中可以使用一些操作符,汇编程序编译时将这些操作符变为相应的数值回送或者定义属性。(1)回送偏移地址值OFFSETMOV BX,OFFSET X;将X单元的偏移地址传送给BXMOV AX,OFFSET START;将标号START的偏移地址传送给AX(2)回送段地址值SEGMOV BX,SEG X;将X单元的段地址传送给BXMOV AX,SEG STA

13、RT;将标号START的段地址传送给AX,(3)类型回送操作符TYPEMOV BX,TYPE X;如果X是字节单元,则回送值为1,即 BX1;若是字单元,值为2,双字单元,值为4(4)属性操作符PTRMOV BYTE PTR BX,10;定义目的操作数为字节单元MOV WORD PTR SI,20;定义目的操作数为字单元(5)类型操作符LABELX LABEL BYTE;X单元的类型定义为BYTE字节型,也可以定 义为 WORD字型、DWORD双字型等,6.注释伪指令,分号“;”后面的内容为注释。编写程序时最好加入注释,便于以后的阅读和修改。,练习:,写出伪指令,并回答问题。(1)定义名为NE

14、W的字单元,保存10,20,30,40四个数(2)将NEW单元的段地址放入DX寄存器,偏移地址放入BX寄存器(3)NEW中数值40所在单元的偏移地址是多少?(4)如果将NEW单元的偏移地址设置为10H,用什么伪指令?,4.3基本汇编指令,1MOV传送指令 MOV传送指令是双操作数指令,SRC为源操作数、DST为目的操作数。要求两个操作数的属性必须一致。格式:MOV DST,SRC 目的操作数,源操作数,4.3.1 数据、栈及查表,2.数据交换指令XCHGXCHG指令是双操作数指令,指令的功能是将两个操作数的内容互换。要求必须有一个操作数是寄存器,而且两个操作数的属性必须一致。操作数不能为立即数

15、。格式:XCHG OPR1,OPR2,例1 XCHG AX,BX;寄存器AX和BX的内容互换XCHG BX,AL;AL寄存器的内容和字节型 存储单元的内容互换XCHG CX,XSI;CX寄存器的内容和字型存 储单元的内容互换,3进栈和出栈指令(1)PUSH进栈指令 格式:PUSH SRC执行操作:(SP)(SP)-2(SP)+1,(SP)(SRC)先将堆栈指针SP减2,再将操作数SRC入栈。要求SRC必须是字。PUSH AX(2)POP出栈指令 格式:POP DST执行操作:(DST)(SP)+1,(SP)(SP)(SP)+2将堆栈指针所指字单元的内容弹到操作数DST中,再将SP加2。POP

16、AX,例1 已知(AX)=95E3H,(BX)=1986H,(SP)=0010H,(SS)=1250H,将AX、BX压栈保存。画出入栈过程。执行指令:PUSH AX PUSH BX入栈过程示意:,例2 上例中,接着执行若干指令后,再执行出栈操作。执行指令:MOV AX,0MOV BX,1POP BXPOP AX 出栈过程示意:,如果在写出栈指令时,换成别的寄存器,那么就相当于用堆栈中的数据给其他寄存器赋值。例如:PUSH AXPUSH BXPOP CXPOP DX执行后(CX)=1986H,(DX)=95E3H。,设计思路:(1)用伪指令定义存储单元x中的三个数(2)y存储单元预留出三个空单元

17、(3)用PUSH和POP指令实现数的倒序存放(4)PUSH和POP的操作数均采用直接寻址方式程序如下:,示例4-1 设计程序。利用堆栈,将存储单元中的三个数倒序存放。,;程序4-1.asm3个数的倒序存放data segmentx dw 12,34,56y dw 3 dup(?)data endscode segmentassume cs:code,ds:datastart:mov ax,data mov ds,ax push x push x+2 push x+4 pop y pop y+2 pop y+4 mov ah,4ch int 21hcode ends end start,4.查表

18、转换指令XLAT(1)格式:XLAT执行的操作:在BX为表首地址的内存表中查找相对地址为AL的单元,取出其中的内容放入AL中。(2)要求:数据表的首地址放入BX,要查找的单元的偏移地址由AL指出。(3)功能:把AL中的数据换成对应的存储单元中的内容。,设计思路:(1)一位十六进制数:0-9,A-F(2)ASCII码:30H,39H,41H,42H,46H(3)算法确定:建立数据表TABLE,并以十六进制数HEX作为索引号(位移量)(4)采用DOS中断调用实现显示功能TABLE表在内存的存储情况:,示例4-2 编程序。用查表指令将一位十六进制数转换为它相应的ASCII码并显示出该数。,;prog

19、ram 4-2.asmdata segmenttable db 30h,31h,32h,33h,34h,35h,36h,37h db 38h,39,41h,42h,43h,44h,45h,46hhex db 6;要查找6ascii db?data endscode segmentassume cs:code,ds:databegin:mov ax,datamov ds,axmov bx,offset table;bxtable表的偏移地址mov al,hex;al6xlat;换码指令mov ascii,al;保存查到的ASCII码mov dl,al;要显示的字符放入DLmov ah,02h;D

20、OS中断调用的2号功能int 21h;INT中断调用指令mov ah,4chint 21hcode endsend begin,返回,4.3.2 逻辑地址的获得,LEA有效地址传送指令格式:LEA 寄存器,存储单元功能:将存储单元的有效地址传送给寄存器。其作用与前面讲的OFFSET操作符的作用一样。,例:LEA BX,TABLE LEA DX,BX LEA BX,COUNTSI,2LDS数据段地址传送指令,格式:LDS 寄存器,双字存储单元功能:将双字单元中保存的低字送入寄存器,高字传送给DS数据段寄存器。,例:已知(DS)=1300H,(BX)=0032H,(13032H)=3504H,(1

21、3034H)=2936H,执行指令:LDS SI,BX源操作数的有效地址为0032H其物理地址=1300H10H+0032H=13032H指令执行后:(SI)=3504H,(DS)=2936H,3LES附加段地址传送指令格式:LES 寄存器,双字存储单元功能:将双字单元中保存的低字送入寄存器,高字传送给ES数据段寄存器。,例:已知(DS)=1400H,(BX)=0046H,(14046H)=2307H,(14048H)=5640H,执行指令:LES DI,BX源操作数的有效地址为0046H其物理地址=(DS)10H+EA=1400H10H+0046H=14046H指令执行后:(DI)=2307

22、H,(ES)=5640H,4.3.3 符号位扩展,1CBW字节扩展为字指令格式:CBW功能:将AL扩展到AX。如果AL的符号位为0,则AH为0,如果AL的符号位为1,则(AH)=FFH2CWD字扩展为双字指令格式:CWD功能:将AX扩展到DX。如果AX的符号位为0,则DX为0,如果AX的符号位为1,(DX)=FFFFH,4.3.4 双精度数运算,无论是单精度数运算还是双精度数运算,都要用到算术运算类指令。算术运算类指令包括加法指令、减法指令、乘法指令、除法指令四种类型。这些指令有双操作数指令也有单操作数指令,运行的结果会影响标志位。,1ADD加法指令格式:ADD DST,SRC功能:源操作数和

23、目的操作数相加,结果再放入目的操作数DST。2.ADC带进位加法指令格式:ADC DST,SRC功能:源操作数加上目的操作数再加上进位标志CF,结果放入目的操作数DST。ADC带进位加法指令一般用在双精度加法操作中。,例:ADD AX,5 ADD AL,30H ADD BH,CL ADD AX,SI ADD BYTE PTRBX,2,3INC加1指令格式:INC OPR功能:将操作数OPR加1,设计思路:(1)两个双精度数存放在数据段中。相加后的结果也放在数据段中。(2)程序中用dx、ax存放第一个双精度数20034910h,用cx、bx存放第二个双精度数1008e699h。程序如下:,示例4

24、-4 编程序实现两个双精度数20034980H和1008E699H加法运算。,;program 4-4.asm 两个双精度数加法code segmentassume cs:code,ds:datastart:mov ax,data mov ds,ax mov ax,ds:0;第一个双精度数的低字 mov dx,ds:2;第一个双精度数的高字 mov bx,ds:4;第二个双精度数的低字 mov cx,ds:6;第二个双精度数的高字 add ax,bx;低字相加 adc dx,cx;高字带进位加 mov ds:8,ax mov ds:10,dx mov ah,4ch int 21hcode en

25、dsend start,data segment dd 20034980h dd 1008e699h dd?data ends,4.3.5 多字节数运算,1SUB减法指令格式:SUB DST,SRC功能:目的操作数减源操作数,结果再放入目的操作数DST。,2SBB带借位减法指令格式:SBB DST,SRC功能:目的操作数减去源操作数后再减去进位标志CF,结果放入目的操作数DST。SBB带借位减法指令一般用在双精度减法操作中。,3DEC减1指令格式:DEC OPR功能:将操作数OPR减14NEG求补指令格式:NEG OPR功能:将操作数求反加1。即求补操作,对正数的补码求补变为其负数的补码,对负

26、数的补码求补变为其正数的补码。利用NEG指令可以求负数的绝对值。,5CMP比较指令格式:CMP OPR1,OPR2功能:将两个操作数作相减运算,结果不回送,改变标志位。通常后跟条件转移指令,根据CMP比较之后标志位的值进行转移。,4.3.6 乘除运算,1MUL无符号数乘法指令乘法指令是单操作数指令。字节乘法的8位被乘数隐含在AL中,字乘法的16位被乘数隐含在AX;乘数写在指令中。(1)字节乘法格式:MUL SRC功能:(AX)(AL)(SRC)执行的操作:将AL与字节型源操作数SRC相乘,乘积放入AX寄存器。即两个8位数相乘,乘积为16位数。,(2)字乘法格式:MUL SRC功能:(DX、AX

27、)(AX)(SRC)执行的操作:将AX与字型源操作数SRC相乘,乘积放入DX、AX寄存器,即乘积为双精度数。,2IMUL带符号数乘法指令与无符号数乘法指令格式一样,但是指令的操作码改为IMUL。执行带符号数乘法指令时,系统将把操作数作为补码进行运算。(1)字节乘法格式:IMUL SRC(2)字乘法格式:IMUL SRC,例1 设(AL)=35H,(BL)=89H。用无符号乘法指令做乘法操作,用DEBUG 观察运行结果。35H=53,89H=137,乘积是1C5DH=7261。MOV AL,35HMOV BL,89HMUL BL,例2 设(AL)=35H,(BL)=89H。用带符号乘法指令做乘法

28、操作,观察运行结果。补码35H=53,89H=-119,乘积是E75DH=-6307。MOV AL,35HMOV BL,89HIMUL BL,4.3.7 混合算术运算,1DIV无符号数除法指令除法指令也是单操作数指令。字节除法的16位被除数隐含在AX中,8位除数在指令中;字除法的32位被除数隐含在DX、AX,16位除数写在指令中。(1)字节除法格式:DIV SRC功能:(AL)(AX)(SRC)的商(AH)(AX)(SRC)的余数执行的操作:16位被除数AX与8位源操作数SRC相除,8位的商放入AL寄存器,8位余数在AH寄存器中。,(2)字除法格式:DIV SRC功能:(AX)(DX、AX)(

29、SRC)的商(DX)(DX、AX)(SRC)的余数执行的操作:32位被除数DX、AX与16位源操作数SRC相除,16位的商放入AX寄存器,16位余数在DX寄存器中。,2IDIV带符号数除法指令指令的操作码为IDIV。指令格式与无符号数除法一样。执行带符号数除法指令时,系统把操作数作为带符号数补码进行运算,商和余数也都是带符号数。(1)字节除法格式:IDIV SRC(2)字除法格式:IDIV SRC,示例4-6 编程序,实现混合算术运算。算术表达式如下:W=(X3Y45)Z其中,X、Y、Z均为16位带符号数。要求运算结果的商保存在W、余数保存在W+2单元中。,设计思路:(1)在数据段中定义4个字

30、型变量X、Y、Z、W。(2)采用带符号数乘除指令,要注意操作数的属性问题。(3)假定X、Y、Z的值如程序所示,则结果应为:商在W单元=FFFCH=4,余数在W+2单元=FFFCH。,程序如下:data segment x dw 48 y dw-21 z dw 14 w dw?,?data endscode segmentassume cs:code,ds:datastart:mov ax,data mov ds,ax mov ax,3 imul y mov bx,ax,mov cx,dx mov ax,x cwd add ax,bx adc dx,cx sub ax,45 sbb dx,0 i

31、div z mov w,ax mov w+2,dx mov ah,4ch int 21hcode ends end start,W=(X3Y45)Z,4.3.8 十进制数运算,1、压缩的BCD码加法调整格式:DAA功能:如果AL的低4位大于9,则将AL加6,并将辅助进位标志AF置1。如果AL的高4位大于9,将AL加60H,并将进位标志CF置1。,例 十进制计算57=12,用BCD码表示做计算。X DB 05H Y DB 07HMOV AL,XADD AL,Y;相加后,(AL)=00001100=0CHDAA;加6调整后,(AL)=00010010=12H(压缩的BCD码),2压缩的BCD码减法

32、调整格式:DAS 功能:如果AL的低4位大于9,则将AL减6,并将AF置1。如果AL的高4位大于9,将AL减60H,并将CF置1。,例 十进制计算6238=24W1 DB 62H;BCD码表示的十进制62W2 DB 38HMOV AL,W1SUB AL,W2;相减后,(AL)=2AHDAS;减6调整后,(AL)=24H,3.非压缩BCD码加法调整格式:AAA功能:如果AL的低4位大于9,将AL加6、AH加1,AL的高4位清零、CF、AF置1。由于非压缩的BCD码用1个字节表示1个十进制数,所以调整后若加上30H就是该数值的ASCII码。,例 十进制计算6+8=14,用非压缩的BCD码表示并显示

33、在屏幕上。T1 DB 06HT2 DB 08HMOVAL,T1;(AL)=00000110=06HADDAL,T2;(AL)=00001110=0EHAAA;调整后(AH)=01H,(AL)=04HADD AX,3030H;AH、AL分别加上30H,变成ASCII码MOVBX,AX;用BX保存MOV DL,BH;显示“1”MOV AH,2;2号显示功能INT 21H;DOS中断调用MOV DL,BL;显示“4”INT 21H,4非压缩的BCD码减法调整格式:AAS 功能:如果AL的低4位大于9,将AL减6、AH减1,AL的高4位清零、CF、AF置1。,例 十进制计算5718=39,用非压缩的B

34、CD码表示。MOV AX,0507HMOV BX,0108HSUB AL,BLSUB AH,BH;高位不用带借位减 AAS;减法调整后(AX)=0309H,5非压缩的BCD码乘法调整格式:AAM(ASCII Adjust Multiply)功能:将乘积AX中的2个非压缩的BCD码调整。AL除以0AH,得到的商送AH,余数送入AL。即乘积的高位数在AH、低位数在AL中。,例 十进制乘法68=48,用非压缩的BCD码表示,并显示。P1 DB 06HP2 DB 08H MOV AL,P1;(AL)=00000110=06HIMUL P2;(AL)=00110000=30HAAM;调整后(AH)=04

35、H,(AL)=08HADD AX,3030H;AH、AL分别加上30HMOV BX,AX;用BX保存MOV DL,BH;显示“4”MOV AH,2INT 21HMOV DL,BL;显示“8”INT 21H,6非压缩的BCD码除法调整格式:AAD(ASCII Adjust Division)功能:在做除法之前,将被除数AX中的2个非压缩的BCD码调整。(AL)=(AL)+(AH)*10,AH清零。除法之后,商在AL、余数在AH中。,4.4 屏幕显示和键盘输入,常用的DOS功能有5个:键盘输入1个字符:01号DOS功能调用显示器输出1个字符:02号DOS功能调用键盘输入缓冲区:0AH号DOS功能调

36、用显示字符串:09号DOS功能调用返回DOS控制:4CH号DOS功能调用,4.4.1 DOS功能调用,1单字符的输入输出(1)1号功能键盘输入格式:AH=1 INT 21H功能:从键盘输入一个字符并将该字符的ASC码送入AL中。,(2)2号功能显示器输出格式:AH=2 DL=字符 INT 21H功能:输出DL中的一个字符到显示器的光标处。,例1 从键盘输入一个字符后,接着再显示出来。MOV AH,1 INT 21HMOV DL,ALMOV AH,2INT 21H,例2 键盘输入的大写字母换成小写字母显示MOV AH,1INT 21HADD AL,20H;大写转换为小写MOV DL,ALMOV

37、AH,2INT 21H,2键盘输入字符串格式:AH=10 DS:DX=字节缓冲区首址 INT 21H说明:定义缓冲区的第1个字节单元为允许输入的最大字符数,第2个单元为实际键入个数(由系统自动填入),从第3个单元开始存放键入字符。功能:从键盘输入一串ASCII字符到缓冲区,用“回车”结束输入。若输入字符超过缓冲区能容纳的个数,则系统忽略此字符并响铃警告。,例 设置缓冲区,允许从键盘输入10个字符。BUFFER DB 10,?,10 DUP(?)MOV AX,SEG BUFFERMOV DS,AXMOV DX,OFFSET BUFFERMOV AH,10INT 21H执行结果:例如从键盘输入 H

38、ello(回车),缓冲区存储情况:,3显示字符串格式:AH=9 DS:DX=字符串地址 INT 21H功能:显示一个以“$”结尾的ASC码字符串。,例 DISPLAY DB Very Good!,$MOV AX,SEG DISPLAY MOV DS,AX LEA DX,DISPLAY MOV AH,9 INT 21H屏幕上显示出:Very Good!,示例4-2,4.4.2 直接写显存显示字符,1字符属性(1)单色字符显示属性字符可以是单色的和彩色的。对于单色字符来说,属性字节的表示如下:,通常的属性值=07H,(00000111)表示黑底白字、正常显示。属性值可以任意组合,见单色显示属性表。

39、,(2)彩色字符显示属性彩色字符的背景色可以有8种颜色,前景色有16种颜色。其属性字节表示为:前景色由4位(0、1、2、3)组合,背景色由3位(4、5、6)组合。BL表示闪烁,RGB为红、绿、蓝,I代表亮度。,2显示位置显示位置对于2580彩色字符模式,一屏字符需要占用4000个字节,因此显示缓冲区分为8页,每页4KB。B8000HB8F9FH(4000个字节)为第0页的内容。由于一行有80个字符,共占用160(A0H)个字节,因而显存单元和显示器中的行对应关系为:,000H09FH单元对应显示器上的第0行0A0H13FH单元对应显示器上的第1行140H1DFH单元对应显示器上的第2行1E0H

40、27FH单元对应显示器上的第3行 F00HF9FH单元对应显示器上的第24行以此类推,两行之差为A0H。,设计思路:(1)第2行行首是显存的140H单元,第3列为显存的06H、07H单元。因此第2行第3列对应的起始字符存储单元的偏移地址应为140H+06H和140H+07H这两个字节单元;(2)字符的属性为蓝底黄字1EH;将显存设置在ES附加段,把数据段中的字符串写入附加段中的显存里。,示例4-7 在屏幕的2行3列上显示蓝底黄字的字符串“Good!”。,程序如下:;program 4-7.asm data segmentdisp db Good!data endscode segmentass

41、ume cs:code,ds:datastart:mov ax,datamov ds,axmov ax,0b800h;显存首址esmov es,axmov al,disp0 mov es:146h,al;第一个字母es:146h单元mov byte ptr es:147h,1eh;属性es:147h单元,下同,mov al,disp1;第2个字母”o”mov es:148h,almov byte ptr es:149h,1ehmov al,disp2mov es:14ah,almov byte ptr es:14bh,1ehmov al,disp3mov es:14ch,almov byte

42、ptr es:14dh,1ehmov al,disp4mov es:14eh,almov byte ptr es:14fh,1ehmov ah,4chint 21hcode endsend start,4.5 实例四 带彩色显示的算术程序,简化的段定义结构用于小规模的程序设计中。程序有一个代码段、一个数据段,每段不大于64KB。堆栈段、附加段和数据段共用。因此,小规模的程序最大不能超过128KB。使用简化段结构便于汇编语言模块与高级语言模块的连接。,4.5.1 简化的程序结构,4.5.2 实验示例,设计思路:(1)用DOS中断调用的1号功能输入数据,用2号功能显示结果,9号功能显示提示信息;(

43、2)做乘法时必须将输入数字的ASCII码去掉,转换成数值;(3)乘法之后用十进制调整指令AAM。,示例4-9 从键盘输入两个一位的十进制数,做乘法运算。相乘的结果保存在存储单元x中,算式显示在屏幕上。用简化的程序格式。,运行结果:,程序如下:,;4-9.asm.model small.data x db?,?infor db input:,$.stack 100h.codestart:mov ax,datamov ds,axmov dx,offset informov ah,9;显示提示信息“input:”int 21hmov ah,1;键盘输入int 21hsub al,30h;去掉ASCI

44、I码mov bl,al,mov dl,2ah;显示乘号mov ah,2int 21hmov ah,1int 21h;输入第2个数sub al,30hmov ah,0mul bl;相乘aam;十进制乘法调整;乘积高位数在AH,低位数在ALmov x,al;保存结果mov x+1,ahadd ax,3030hmov bx,ax,mov ah,2mov dl,3dh;显示=int 21hmov dl,bh;显示结果int 21hmov dl,blint 21hmov ah,4chint 21hend start,4.5.2 实验任务,实验目的:通过设计顺序程序,掌握汇编语言程序设计思路和编写方法,并通过实验观察和分析程序的执行结果。熟练掌握数值计算程序设计方法。实验内容:参考示例4-9,完成下列实验内容:设计程序。实现Y=2X+3,X是一位十进制数。要求X从键盘输入,在下一行上显示y=2X+3=以及十进制计算结果。,实验要求:(1)写出设计思路和程序源码(2)实验内容用截图形式记录实验结果(3)写出实验结果分析。实验拓展:(1)如果以黄底红字显示结果,程序应该怎么改?(2)自由设计一个计算型实验题目并编程实现。,习题四,P89 3,4,5,8,9,10 12,14,16,23,24,25,29,30,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号