第四章 汇编语言程序基础.ppt_第1页
第四章 汇编语言程序基础.ppt_第2页
第四章 汇编语言程序基础.ppt_第3页
第四章 汇编语言程序基础.ppt_第4页
第四章 汇编语言程序基础.ppt_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章 汇编语言程序基础,带着问题去学习,把若干条汇编指令放在一起就是汇编语言程序吗? 运算结果怎样显示在屏幕上? 含有键盘输入的程序如何编写? 完整的汇编语言程序有哪些要求? 简化的程序格式是不是更方便?,4.1 第一个汇编语言程序,编写一个汇编语言程序,实现下列公式计算。假设X=4,Y=5 Z=X+Y-6 设计思路: 1)设公式中出现的三个变量X,Y,Z是16位带符号数; 2)用算数运算指令实现加减 3)指令顺序按照运算顺序书写,Z=X+Y-6,程序段: MOV AX,X ;AXX ADD AX,Y ;AXX+Y 加法 SUB AX,6 ;AXX+Y-6 减法 MOV Z,AX ; ZAX

2、,如何执行?,back,;1_1.asm 公式计算 DATA SEGMENT ;段定义开始(DATA段) X DW 4 ;定义第一个加数 Y DW 5 ;定义第二个加数 Z DW ? ;准备用来存放结果的单元 DATA ENDS ;段定义结束 CODE SEGMENT ;段定义开始 (CODE段) ASSUME CS:CODE, DS:DATA ;ASSUME伪指令规定段的性质 START: MOV AX, DATA MOV DS, AX ;将数据段段地址送入DS MOV AX, X ; 汇编指令 ADD AX, Y SUB AX, 6 MOV Z, AX MOV AH, 4CH ;4CH返回

3、子功能号 INT 21H ;DOS 中断调用 CODE ENDS ;代码段结束 END START ;整个程序结束伪指令,从上面这个例子可以看出,汇编语言源程序由若干个语句组成,语句分为如下两类: 由指令组成的可执行性语句 指令语句即由8086/8088提供的指令形成的语句,它能够被翻译成机器代码,并完成一定操作功能。 由伪指令组成的说明性语句 伪指令语句也叫指示性语句,它只是为汇编程序在翻译汇编语言源程序时提供有关信息,并不翻译成机器代码。,myfile.asm,编辑程序,汇编程序,连接程序,myfile.crf,otherfiles.obj,myfile.lst,myfile.obj,my

4、file.map,myfile.exe,4.2汇编语言程序上机过程,汇编程序功能,汇编程序的主要功能: 检查源程序,给出出错信息。 产生目标文件(.obj)和列表文件(.lst)。 展开宏指令。,CEDIT MYFILE . ASM CMASM MYFILE . ASM Microsoft (R) Macro Assembler Version 5.10 Copyright (C) Microsoft Corp 1981,1988.All rights reserved. Object filename MYFILE.OBJ: Source listing NUL.LST: MYFILE.LS

5、T Cross-reference NUL.CRF: 47962 + 413345Bytes symbol space free 0 Warning Errors 0 Severe Errors CLINK MYFILE . OBJ Microsoft (R) Overlay Linker Version 3.64 Copyright (C) Microsoft Corp 1983-1988. All rights reserved. Run File MYFILE.EXE: List File NUL.MAP: Libraries .LIB: LINK : warning L4021: no

6、 stack segment CMYFILE,ML /Fl /Sg MYFILE.ASM,ML /c MYFILE.ASM,建立,运行汇编语言程序上机步骤,调试程序,-U 反汇编 -G 断点 执行程序 -D DS:0 查看数据段 -Q 退出,进入DEBUG后,执行如下命令:,4.2汇编语言程序上机过程,用 MASM 6.11 和 CodeView 汇编和调试汇编语言程序 在 MASM 6.11 中,Microsoft 公司提供了程序员工作平台 PWB(programmers work bench),这是一个集成化开发环境,程序员可以方便地完成汇编语言源程序的编辑、汇编、连接调试和执行等工作。

7、MASM 6 提供的调试工具是 CodeView,CodeView 是一个源码级调试工具,能支持 16 位和 32 位指令的调试。其用户界面是多窗口全屏幕的,用户可方便地使用菜单和鼠标来调试程序。,上机步骤: 1 设置环境变量 在 MASM611BIN的目录下,执行 new-vars.bat 即可建立环境参数和搜索路径,然后执行 pwb.exe 即可进入 PWB 的主窗口。用其文件 File 菜单中的 Exit 命令可退出 PWB。,2 用 File 菜单下的有关命令建立 asm 文件 3 用 Project 和 Options 菜单下的某些命令建立汇编语言程序运行环境 建立工程文件,设置所建

8、立的可执行文件类型的 Build Options,设置编译器选项的 Language Options,设置连接器选项的 Link Options,设置调试器选项 的 CodeView Options 等。由于用户使用时大部分选项都可采用 PWB 提供的默认值,因而不必作任何修改。 4 用 Project 菜单下的有关命令对源文件进行汇编和连接 Compile File 编译(汇编)当前的源文件,生成目标文件 Build 连接目标文件,生成可执行文件 Build All 汇编当前源文件,连接工程中的所有目标文件,生成可执行文件 5 用 Run 菜单下的有关命令执行程序 6 用 CodeView

9、调试程序,4.3指令系统,重点掌握常用指令功能及应用 数据传送指令 加减法指令 逻辑运算和移位指令 控制转移指令 (后续章节介绍) 字符(串)输入输出功能实现,重点关注: 指令的汇编格式 指令的基本功能 指令支持的寻址方式 指令的执行对标志位的影响 指令的特殊要求,8086指令系统概述,Intel 8086指令系统可分成6个功能组 数据传送类指令 算术运算类指令 位操作类指令 控制转移类指令(后续章节介绍) 串操作类指令 (后续章节介绍) 处理机控制类指令,伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。,处理器选择伪指

10、令 段定义伪操作 程序开始和结束伪操作 数据定义及存储器分配伪操作 表达式赋值伪操作 地址计数器与对准伪操作 基数控制伪操作,4.4 常用伪指令(伪操作),1)处理器选择伪指令,选择不同类型的指令系统 默认是.8086,.8086 选择 8086 指令系统 .286 选择 80286 指令系统 .286P 选择保护模式下的 80286 指令系统 .386 选择 80386 指令系统 .386P 选择保护模式下的 80386 指令系统 .486 选择 80486 指令系统 .486P 选择保护模式下的 80486 指令系统 .586 选择 Pentium 指令系统 .586P 选择保护模式下的

11、Pentium 指令系统,2)段定义伪指令,完整的段定义伪指令,简化段定义伪指令,段组定义伪指令,完整的段定义伪操作,data segment ; 定义数据段 data ends extra segment ; 定义附加段 extra ends code segment ; 定义代码段 assume cs:code, ds:data, es:extra start: mov ax, data mov ds, ax ; 段地址 段寄存器 mov ah,4ch int 21h code ends end start, code segment main proc far assume start:

12、 push ds mov ax, 0 push ax ret main endp code ends end start, code segment main proc far assume start: mov ax,4c00h int 21h main endp code ends end start,例题4.1,data segment data ends stack segment dw 100 dup (?) tos label word stack ends code segment main proc far assume cs:code, ds:data, ss:stack s

13、tart: mov ax, stack mov ss, ax mov sp, offset tos push ds sub ax, ax push ax mov ax, data mov ds, ax ret main endp code ends end start,带堆栈段的汇编源程序:,00C8H sp, stack segment dw 100 dup (?) tos label word stack ends mov ax, stack mov ss, ax mov sp, offset tos push ds sub ax, ax push ax ,堆栈段的情况:,data seg

14、ment data ends stack segment stack dw 100 dup (?) tos label word stack ends code segment start: push ds sub ax, ax push ax mov ax, data mov ds, ax ret code ends end start,段名 SEGMENT 定位类型 组合类型 使用类型 类别 ; 语句序列 段名 ENDS,定位类型 align_type PARA BYTE WORD DWORD PAGE 组合类型 combine_type PRIVATE PUBLIC COMMON STA

15、CK AT exp 使用类型 use_type USE16 USE32 (4) 类别 class,Back,简化的段定义伪指令,存储模型:TINY/SMALL/MEDIUM/LARGE/HUGE/FLAT 在简单化段定义前必须指定存储模型,使用 MODEL 伪操作 格式如下: .MODEL 存储模型 ,语言类型 ,操作系统类型 ,堆栈选项 存储模型:tiny small medium compact large huge flat,.code name .data .data? .fardata name .fardata? name .const .stack size,简化的段定义伪指令,

16、.model small .stack 100h .data .code start: mov ax,datamov ds,ax mov ax,4c00h int 21h end start,.model small .stack 100H .data .code .startup .exit 0 end,Back,段组定义伪指令,dseg1 segment word public data dseg1 ends dseg2 segment word public data dseg2 ends datagroup group dseg1, dseg2 cseg segment para pu

17、blic code assume cs:cseg, ds:datagroup start: mov ax, datagroup mov ds, ax mov ax, 4c00h int 21h cseg ends end start,data1 segment word const1 dw 100 data1 ends data2 segment word var1 dw ? data2 ends datagroup group data1,data2 code segment assume cs:code, ds:datagroup,mov ax, datagroup mov ds, ax

18、mov ax, const1 mov var1, ax mov ax, 4c00h int 21h code ends end start,3)程序开始和结束伪指令,TITLE text NAME module_name END label .STARTUP .EXIT return_value ,练习:,如何显示“Hello, Assembly language!”字符串? 字符串如何定义?怎么显示? 用完整的段定义格式 用简化的段定义格式,如何定义常量、变量、标号、表达式呢?,常量,常数(常量)表示一个固定的数值 它又分成多种形式: (1)十进制常数 (2)十六进制常数 (3)二进制常数

19、(4)八进制常数 (5)字符串常数 (6)符号常数,字符串常量,用单引号或双引号括起来的单个字符或多个字符,其数值是每个字符对应的ASCII码的值 例如:d = 64H AB= 4142H Hello, Everybody !,利用一个标识符表达的一个数值 MASM提供等价机制,用于常量定义 符号定义伪指令(表达式赋值伪指令) 等价EQU伪指令 符号名 EQU 数值表达式 符号名 EQU 等号=伪指令 符号名 = 数值表达式 常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性,实例,符号常量,符号定义 DosWriteChar equ 2 CarriageReturn =

20、13 CallDOS equ 符号应用(左边程序段等价右侧的符号形式) mov ah,2;mov ah,DosWriteChar mov dl,13;mov dl,CarriageReturn int 21h;CallDOS,符号常量实例,4)数据定义及存储器分配伪指令,格式: 变量名 助记符 操作数 , 操作数 , ; 注释 功能: 为变量申请固定长度的存储空间,并可同时将相应的存储单元初始化 各部分含义: 变量名助记符操作数项,变量名,变量名为用户自定义标识符,表示初值表首元素的偏移地址;用这个符号表示地址,常称为符号地址。 如:TABLE DB 1,2,3 变量名可以没有。这种情况,汇编

21、程序将直接为初值表分配空间,无符号地址 如:DB 1,2,3 设置变量名是为了方便存取它指示的存储单元,助记符,DB DW DD DF DQ DT 表示申请的主存空间单位 DB定义字节伪指令,每一个数据项都占用一个字节存储单元 DW定义字伪指令 DD定义双字伪指令 DF定义6字节伪指令 DQ定义字节伪指令 DT定义10字节伪指令,操作数项,操作数项是用逗号分隔的若干数据 主要由数值常数、表达式或?、DUP组成 ?表示初值不确定,即未赋初值; DUP表示重复初值 DUP的格式为: 重复次数 DUP(重复参数) 也可以是字符串常数。它是由括号括起来的一个或多个字符。串常数的值是包括在引号钟的字符的

22、ASCII码值。,这些数据定义伪操作可以定义初始化数据也可以定义未初始化数据, 定义初始化数据: 为各数据分配存储空间,并将数据存入指定的存储单元 定义未初始化数据: 分配一定的存储空间,并不存入确定的值。,例4.8:,例4.9,例4.11,例4.10,例4.8,DATA_BYTE DB 10,4,10H,? DATA_WORD DW 100,100H,-5,?,例4.9,ARRAY DB HELLO DB AB DW AB,例4.10,ABC DB 0,?,?,?,0 DEF DW ?,52,0,例4.11,ARRAY DB 100 DUP(?) ARRAY2 DB 100 DUP(0,2

23、DUP(1,2),0,3),数据定义伪操作还可以把变量或标号的偏移地址()或由16位段地址和偏移地址组成的整个地址存入存储器(DD).,PAR1 DW 100,200 PAR2 DW 300,400 ADDR_TABLE DW PAR1,PAR2 130页 图4.7,变量的类型属性,变量的类型属性用来表示该语句中每一个数据项占用的字节数 BYTE 1 WORD 2 DWORD 4 FWORD 6 QWORD 10 汇编程序可以用这种隐含的类型属性来确定某个指令是字指令,还是字节指令,举例,举例,131页,4.15,OPER1 DB ?, ? OPER2 DW ?, ? MOV OPER1, 0

24、 ;字节指令 MOV OPER2, 0 ;字指令,OPER1 DB 1, 2 OPER2 DW 1234H, 5678H MOV AX, OPER1+1 MOV AL, OPER2 类型不匹配,MOV AX, WORD PTR OPER1+1 MOV AL, BYTE PTR OPER2 (AX)=3402H (AL)=34H,指定操作数的类型属性PTR,LABEL,改变某个操作数的类型属性格式: TypePTR 变量常量表达式 如上例中的程序段,如何对命令加以修正呢? 除此之外,还可以使用LABEL指定变量的类型属性 格式: name LABEL type,返回,例4.16,例4.16,5)

25、表达式赋值伪指令,格式:表达式名 EQU 表达式 B EQU BP+8 ALPHA EQU 9 BETA EQU ALPHA+18 不允许重复定义! “ = ” 伪操作 (允许重复定义!) EMP = 7 EMP = EMP+1 ,6)地址计数器与对准伪指令,地址计数器 $ :保存当前正在汇编的指令的地址 $用在伪操作中 ORG $+8 ; 跳过8个字节的存储区 $ 用在指令中,表示本指令汇编后机器指令第一个字节的地址 JNE $+6 ; 转向地址是 JNE 的首址 +6 $ 用在伪操作的参数字段:表示地址计数器的当前值,举例: ARRAY DW 1, 2 , $+4 , 3 , 4 , $+

26、4,ORG伪操作:,功能:设置当前地址计数器的值 举例:BUFFER LABEL BYTE ORG $+8 BUFFER DB 8 DUP (?),EVEN伪操作,EVEN ;使下一地址从偶地址开始 A DB morning EVEN B DW 2 DUP (?),ALIGN伪操作,格式:ALIGN boundary 其中boundary为2的幂。 ALIGN 4 ALIGN 2 ; EVEN,7)基数控制伪操作,格式:. RADIX 表达式 功能:规定无标记数的基数 MOV BX, 0FFH MOV BX, 178;无标记的数为十进制数 .RADIX 16 MOV BX, 0FF;无标记的数

27、为十六进制数 MOV BX, 178D;,汇编语言程序格式,变量和标号(1),变量和标号分别代表存储单元, 变量表示的存储单元中存放数值, 标号表示的存储单元中存放指令代码 变量名为用户自定义标识符,表示初值表首元素的逻辑地址;用这个符号表示地址,常称为符号地址 变量名可以没有。这种情况,汇编程序将直接为初值表分配空间,无符号地址 设置变量名是为了方便存取它指示的存储单元,变量和标号(2),标号在代码段中定义,后面跟着冒号,它也可以用LABEL/EQU伪操作来定义。它还可以作为过程名定义 经常在转移指令操作数字段使用,用来表示本语句的符号地址 如: JNE TABLE 标号的段总是在CS寄存器

28、中,标号的偏移地址是从段起始地址到定义标号的位置之间的字节数。,标号和变量的属性,标号和变量一经定义便具有以下两类三种属性: 段值 标号和变量对应存储单元的段地址 偏移值 标号和变量对应存储单元的偏移地址 类型 标号、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间 变量名的类型可以是BYTE(字节)、WORD(字)和DWORD(双字)等,注意:,注意:,变量的偏移值,有时也称“变量的值”。但是最好将二者加以区别: 变量的“偏移值”:代表偏移地址;等于当前地址计数器的值,用$表示。 变量的值 :代表变量中存储的内容。 高级语言中出现变量,通常是引用变量中所存放的数据, 汇编

29、语言中出现变量,根据指令的不同,有时引用变量的偏移地址,有时引用变量中存储的数据。对此,应特别加以注意。,数值表达式,数值表达式一般是指由运算符连接的各种常数所构成的表达式 汇编程序在汇编过程中计算表达式,最终得到一个数值 程序运行之前,就已经计算出了表达式;所以,程序运行速度没有变慢,但增强程序的可读性 MASM对除伪指令外各种汇编时处理的指令统称为操作符(Operator),地址表达式,地址表达式表示的是存储器操作数的地址,使用时,只有当其结果有明确意义才有效。 如算术操作数中,两地址相乘或相除是无意义的,两个不同的段地址相加也是无意义的。,常用的表达式操作符,算术操作符 逻辑和移位操作符

30、 关系操作符 数值回送操作符 属性操作符 操作符的优先级,算术操作符,+,-,*,/和MOD(求余) 地址+/-数字量是有意义的。 如:SUM+1是指SUM字节单元的一个字节单元的地址(不是指SUM的内容加1) 举例:139页,例4.18 要求把首地址为BLOCK的字数组的第6个字传送到DX寄存器 MOV DX,BLOCK+(6-1)/2,逻辑和移位操作符,AND、OR、XOR、NOT、 SHL、SHR 按位操作,只能用于数值表达式中 要求汇编程序对逻辑操作符前后两个操作数(或表达式)做指定的逻辑操作 举例:,IN AL, PORT_VAL OUT PORT_VAL AND 0FEH, AL,

31、MOV AX, 0FFFFH SHL 2,; MOV AX,0FFFCH,139页,例4.20,关系操作符,EQ、NE、LT、LE、GT、GE 两个操作数必须是数字或是同一段内的存储器地址 计算结果为逻辑值:真 0FFFFH 假 0000H,MOV FID, (OFFSET Y - OFFSET X) LE 128,若 128 (真) 汇编结果: MOV FID, -1 若 128 (假) 汇编结果: MOV FID, 0,X:. Y:.,数值回送操作符,OFFSET、SEG、TYPE、LENGTH、SIZE OFFSET / SEG 变量 / 标号 功能:回送变量或标号的偏址 / 段址,TY

32、PE 变量 / 标号 / 常数 DB DW DD DF DQ DT NEAR FAR 常数 1 2 4 6 8 10 -1 -2 0,LENGTH 变量 功能:回送由DUP定义的变量的单元数,其它情况回送1,SIZE 变量 功能:LENGTH * TYPE,举例:,举例:,ARRAY DW 100 DUP (?) TABLE DB ABCD ADD SI, TYPE ARRAY ; ADD SI, 2 ADD SI, TYPE TABLE ; ADD SI, 1 MOV CX, LENGTH ARRAY ; MOV CX, 100 MOV CX, LENGTH TABLE ; MOV CX,

33、1 MOV CX, SIZE ARRAY ; MOV CX, 200 MOV CX, SIZE TABLE ; MOV CX, 1,属性操作符,PTR 段操作符 SHORT THIS HIGH、LOW HIGHWORD、LOWWORD,PTR操作符:类型 PTR 表达式,功能:用来给已分配的存储地址(用符号地址表示)赋予另一种属性,使该地址具有另一种类型 类型有:BYTE,WORD,DWORD,FWORD,QWORD,TBYTE,NEAR,FAR 举例: MOV WORD PTR BX, 5,段操作符,格式:段寄存器:地址表达式 段名:地址表达式 组名:地址表达式 举例: MOV ES: BX

34、, AL,SHORT操作符,格式: SHORT 标号 功能:用来修饰JMP指令中转向地址的属性,指出转向地址。 举例: JMP SHORT NEXT,THIS操作符,功能:可以象PTR一样建立一个指定类型(BYTE,WORD等)或指定距离(NEAR或FAR)的地址操作数。该操作数的段地址和偏移地址与下一个存储单元地址相同,TA EQU THIS BYTE NEXT EQU THIS FAR,THIS 类型,HIGH 和LOW操作符,称为字节分离操作符,它接受一个数或地址表达式,HIGH取其高位字节,LOW取其低位字节。 举例:CONST EQU 0ABCDH MOV AH ,HIGH CONS

35、T 将汇编成:MOV AH,0ABH,HIGHWORD和LOWWORD操作符,称为字节分离操作符,它接受一个数或地址表达式,HIGH取其高位字节,LOW取其低位字节。,操作符的优先级,1() LENGTH SIZE WIDTH MASK 2PTR OFFSET SEG TPYE THIS : 3HIGE LOW 4* / MOD SHL SHR 5+ - 6EQ NE GT LT GE LE 7NOT 8AND 9OR XOR 10SHORT,汇编语言程序格式总结:,完整的汇编语言源程序由段组成 一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列 需独立

36、运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点 所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内 通常,程序还需要一个堆栈段,可执行性语句和说明性语句, 执行性语句由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中: 标号: 硬指令助记符 操作数,操作数;注释, 说明性语句由伪指令构成的语句,它通常指示汇编程序如何汇编源程序: 名字 伪指令助记符 参数,参数,;注释,汇编语言程序格式举例,完整段定义格式举例 简化段定义格式举例,完整段定义格式举例,fullExample.asm 说明: PROC和ENDP伪指令用于建立过程,

37、将在以后章节说明 本例只定义了最基本的代码段和数据段,其他附加段和堆栈段,定义方法相同,完整段定义格式举例说明(2),本例把主程序建立为过程,由DOS调用该过程。进入程序后,使DS和0作为段地址和偏移地址入栈,对应在程序结束时用RET指令返回DOS; 若在进入程序时,未有上述三条指令在堆栈中建立返回信息,则应该是用编号为4C的功能调用返回DOS,如下: MOV AX,4C00H INT 21H,简化段定义格式举例,对于MASM5.0,MASM6.0版可采用 singleExample.asm,汇编语言程序上机过程,建立汇编语言编写的环境 编辑程序/汇编程序/连接程序/调试程序 上机过程: ED

38、IT HELLO.ASM MASMHELLO.ASM .OBJ .LST .CRF LINK HELLO.OBJ .EXE .MAP HELLO,一个高质量的程序应具有以下特点:,结构清晰、简明、易读、易调用; 执行速度快; 占用存贮空间小。,程序设计的一般步骤,分析问题,确定设计思路及算法; 确定输入/输出数据的格式; 分配存贮区,定义变量; 画出流程图,要求简洁、明了、直观,要利于简化结构、推敲逻辑关系、排除设计错误,完善算法; 根据流程图编写程序。 上机运行并调试程序。,顺序结构程序设计,特点:无分支、无循环、无转移,以直线方式一条条顺序执行。 流程图:只有开始、结束和若干说明框。,一个

39、顺序结构程序例子,例5.1编写一个汇编语言程序,实现下列公式计算。 假设有两个整数X=4,Y=5求: Z=X+Y-6 主要任务:完成数据传送,如何实现?,设计思路,定义三个字型变量x,y,z,将x,y初始化 对x,y进行算数运算,并把结果进行保存 采用寄存器寻址方式,将结果存入变量z中,流程图,如何实现数据传送?算数运算? 汇编语言指令系统发挥作用!,开始,X=3,y=5,取出x,与y相加,减6,结果存入z,结束,;5_1.asm 公式计算 DATA SEGMENT ;段定义开始(DATA段) X DW 4 ;定义第一个加数 Y DW 5 ;定义第二个加数 Z DW ? ;准备用来存放结果的单

40、元 DATA ENDS ;段定义结束 CODE SEGMENT ;段定义开始 (CODE段) ASSUME CS:CODE,DS:DATA ;ASSUME伪指令规定段的性质 START: MOV AX,DATA MOV DS,AX ;将数据段段地址送入DS MOV AX,X ; 汇编指令 ADD AX,Y SUB AX,6 MOV Z, AX MOV AH,4CH ;4CH返回子功能号 INT 21H ;DOS 中断调用 CODE ENDS ;代码段结束 END START ;整个程序结束伪指令,back,COM文件的建立,用户在建立源文件以后,经过汇编、连接形成 EXE文件,然后可以通过EX

41、E2BIN程序来建立COM文件,操作命令如下: EXE2BIN FILENAME FILENAME.COM ,Com程序的编写,利用MASM 6.x的简化段定义格式,可以非常容易地创建一个COM程序 遵循的规则: 采用TINY模式 源程序只设置代码段,无数据、堆栈等段 程序必须从偏移地址100h处开始执行 数据只能安排在代码段中,注意不能与可执行代码相冲突,通常在程序最后,com程序的内存映象图,COM文件的源程序格式1,code segment code assume cs:code,ds:code,ss:code,es:code org 100H begin: jmp main num1

42、dw 1199H num2 dw 1166H sum dw ? main proc near mov ax, num1 add ax, num2 mov sum, ax mov ax, 4c00h int 21h main endp code ends end begin,COM程序的源程序格式2,.model small .code org 100h begin: jmp main ;* num1 dw 1199H num2 dw 1166H sum dw ? ;* main proc near mov ax, num1 add ax, num2 mov sum, ax mov ax, 4c

43、00h int 21h main endp end begin,.model tiny;微型存储模式 .code;只有代码段 .startup;程序起始点, ORG 100H mov dx,offset string mov ah,9;显示信息 int 21h mov ah,01h;等待按键 int 21h mov ah,02h;响铃 mov dl,07h int 21h .exit 0;程序结束点,返回DOS stringdb Press any key to continue !$ ;数据安排在此 end;汇编结束,Com程序举例,4.5 屏幕显示和键盘输入,DOS功能调用 直接写显存显示

44、字符,4.5.1DOS功能调用,单个字符的输入 单个字符的输出 字符串输入 显示字符串,单个字符的输入,格式: MOV AH,1 INT 21H 2.功能: 从键盘输入一个字符并将该字符的ASCII码送入AL中。 3.输出: AL键入字符的ASCII码,单个字符的输出,格式: MOV DL,字符 MOV AH,2 INT 21H 2.功能: 输出DL中的一个字符到显示器的光标处。,例4.20 从键盘输入一个字符后,接着再显示出来。 MOV AH,1 INT 21H MOV DL,AL MOV AH ,2 INT 21H,字符串输入,格式: DS:DX=字节缓冲区的首地址 MOV AH,0AH

45、INT 21H 2.功能: 从键盘输入一串字符到缓冲区,用“回车”结束输入。若输入字母超过缓冲区容纳的个数,则系统忽略此字符并响铃警告。 3.说明:缓冲区的第一个字节单元为允许输入的最大字节数,第2个单元为实际键入字符的个数(由系统自动填入),从第3个单元开始存放键入字符。,例4-21 设置缓冲区,允许从键盘输入10个字符。 BUFFER DB 10,?,10 DUP(?) MOV AX,SEG BUFFER MOV DS,AX MOV DX,OFFSET BUFFER MOV AH,10 INT 21H 执行结果:例如从键盘输入 Hello (回车),缓冲区存储情况:,DATA,显示字符串,

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

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

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

49、 segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov ax,0b800h ;显存首址es mov es,ax mov al,disp0 mov es:146h,al;第一个字母es:146h单元 mov byte ptr es:147h,1eh;属性es:147h单元,下同,mov al,disp1;第2个字母”o” mov es:148h,al mov byte ptr es:149h,1eh mov al,disp2 mov es:14ah,al mov byte ptr es:14bh,1eh mov al,di

50、sp3 mov es:14ch,al mov byte ptr es:14dh,1eh mov al,disp4 mov es:14eh,al mov byte ptr es:14fh,1eh mov ah,4ch int 21h code ends end start,数字和字母的判断,无论是键盘输入的数字或字母,还是在存储区中定义的字符,都是以ASCII码形式表示的,对数字或字母的判断有多种方法。,数字字符如何转换成实际的数据? 11?,4.6 顺序结构程序设计实例,例1:从键盘上任意输入一个大写字母将其转换成小写字母并显示。 例2:显示字符串“hello world!”. 例3:混合算数

51、运算,计算表达式的值。,5.4 顺序结构程序设计实例,例1:从键盘上任意输入一个大写字母将其转换成小写字母并显示。 .model small .data .code mov ax,data mov ds,ax mov ah,01h int 21h add al,20h mov dl,al mov ah,2 int 21h mov ah,4ch int 21h end,例2 显示字符串“hello world!”,;TITLE display.asm-显示Hello!World!字符串 datarea segment ;定义数据段 string db Hello world!$;字符串定义 da

52、tarea ends prognam segment ;定义代码段 main proc far;主程序 assume cs:prognam,ds:datarea start: ;程序起始执行地址 ;为程序返回DOS设置堆栈值 push ds;入栈保存原DS段地址 sub ax,ax;设置偏移地址为0 push ax;入栈保存偏移地址,mov ax,datarea;datarea段地址 mov ds,ax;datarea段地址装入DS寄存器 leadx,string ;dx获得串首的偏移地址 ; ds:dx联合起来获得串首的逻辑地址 mov ah, 09h ;实现dos功能调用中显示字符串的功能, ;注意:使用此功能串定义时需要以$结尾 int 21h ret;返回DOS main endp;主程序结束 prognam ends;代码段结束 end start;汇编结束,例3:混合算数运算,计算表达式的值。,其中,x、y,z,v,w均为16位带符号数。要求运算结果的商保存在w,余数保存在w+2单元中。 设计思路: 在数据段中定义5个字型变量x,y,z,v,w。 采用带符号数乘除指令,要注意操作数的属性问题。 假定x,y,z,v如程序所示。则计算得出结果存入w。,program 5-3.asm w

温馨提示

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

最新文档

评论

0/150

提交评论