程序设计11.ppt_第1页
程序设计11.ppt_第2页
程序设计11.ppt_第3页
程序设计11.ppt_第4页
程序设计11.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、掌握的内容:段寄存器说明语句的作用,堆栈段定义的特殊性,源程序的各种辅助说明伪指令。 熟练掌握的内容:段的定义。 程序的三大结构(顺序结构、分支结构和循环结构等)在汇编语言中的表现形式。 汇编语言的常用编程工具MASM 、LINK 、Debug的使用,能在该编程环境下完成程序的编辑、汇编、调试和运行等步骤。,汇编语言程序设计,机器语言、汇编语言和高级语言,机器语言的特点:机器语言编写程序工作量大、易错、难读,不便于交流。,汇编语言的特点:用汇编语言编写的程序,易读、易写,也便于交流。但用汇编语言编写程序时,要求程序员了解计算机的结构、指令系统以及其它相关方面的技术知识;编写出的程序不能通用于各

2、种类型的计算机。,高级语言的特点:方便,通用性强,语句功能强,故编程效率高,开发周期短,且更易于掌握和交流。但系统昂贵,体积较大;程序所占用存储空间大,程序执行时间长;对接口的管理方面不方便。,一个基本的汇编语言程序框架如下: stack SEGMENT PARA stack DB 100 DUP(stack) stack ENDS data SEGMENT data ENDS code SEGMENT ASSUME CS:code, DS:data, ES:data, SS:stack start: MOV AX, data MOV DS, AX MOV ES, AX MOV AL, 4CH

3、 INT 21H code ENDS END start,堆栈段,数据段,代码段,真指令,ASM-86汇编语言源程序在结构上持点: (1)一个汇编语言源程序由个或几个段组成,每个段由SEGMENT语句开始,以ENDS语句结束。 (2) 4类段:代码段、数据段、附加段和堆栈段。 (3)若仅由一个段,则这个段必为代码段。 (4)源程序语句无非是指令性语句或指示性语句。 (5)一条语句占一行。 (6) 代码段中ASSUME确定段与段寄存器间的关系。 (7)整个源程序必须用END伪指令来结束。END后面的标号表示该程序执行时的起始地址(亦称人口地址)。,汇编语言源程序书写格式,汇编语言语句的格式: 汇

4、编语言有三种语句:指令语句、伪指令语句和宏指令语句,其格式是类似的: 指令语句的格式:标号: 操作符 参数,参数;注释 伪指令语句的格式:名字 操作符 参数 ,参数,参数;注释 宏指令语句的格式:标号: 操作符 实参数表;注释 三种语句都由四部分组成: 第一部分是标号、名字(包括变量和常量),它应符合下列规定: 1)第一个字符必须是字母、问号“?”、“” 、“.”或“_”; 2)从第二个字符开始可以是字母、数字、问号“?”、“”或“_”; 3)最大长度为31个字符。 4)不应该是保留字。,第二部分是操作符。 第三部分是参数域。参数域都可由以下几种形式组成:常数、寄存器名、存储器操作数和表达式。

5、,(1)常数 二进制数(须用字母B结尾) 十进制数(数字后面加字母D或什么也不加) 十六进制数(用H结尾) 八进制数(用Q结尾) 串常数,串常数的值为串引导中各字符的ASCII码,例如,A的值为41H,而AB6的值为414236H。 为了防止与标识符相混,凡是以字母AH开始的十六进制数,必须在其前面加一个0(零)、如0A786H。,(2)存储器操作数。包括标号和变量 标号和变量都是符号地址,所以它们都有三属性: 段值(SEGMENT):即标号或变量所在段的段基址; 段内地址偏移量(OFFSET):即标号或变量所指的实际地址与所在段的起始地址的差的低16位。 类型(TYPE):对于变量来说,类型

6、指字节、字或是双字等,取决于定义变量的伪指令。 对于标号来说,类型指NEAR还是FAR。,(3)表达式 算术表达式:加()、减()、乘()、除(/)、求余(MOD)、右移(SHR)和左移(SHL) 逻辑表达式:包括按位运算的与(AND)、或(OR)、异或(XOR)和非(NOT)。 注: AND、OR、NOT和XOR既是逻辑运算符,又是指令助记符。作为指令助记符,它们必须出现在指令的操作符部分,且其操作是在程序执行时进行的;而逻辑运算符的操作是在汇编过程中完成的如:ORDX,7532HAND0FFFFH 关系表达式:关系运算有相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于等于(LE

7、)、大于等于(GE)六种。 运算结果只有两种可能:若关系是假(关系不成立),则结果为0,若关系为真,则结果为全1。 如:MOVBX,3LT5;BX0FFFFH,数值回送符:有SEG、OFFSET、TYPE、LENGTH和SIZE。 前三种分别用来分离存储器操作数的段、偏移量和类型三种属性。 后两种用来求数组变量的长度和字节数。 1)格式:SEG 变量标号 功能:取变量或标号的段基址。 例如,设OPER1为数据段中定义的变量,则 MOV AX,SEG OPER1 指令的含义是把变量OPERl的段基址送寄存器AX。 2)格式:OFFSET 变量标号 功能:取变量或标号的偏移地址。 例如,设OPER

8、1为数据段中定义的变量,则 MOV AX,OFFSET OPER1 指令含义是把变量OPERl的偏移地址送寄存器AX。,3)格式:TYPE 变量标号 功能: 取变量或标号的类型值。当作用于变量时,得到的是该变量的长度类型值;作用于标号时,将得到该标号的距离类型值,但TYPE运算符主要作用于变量。,4)格式:LENGTH 变量 功能: 获取为变量分配的项数。,5)格式:SIZE 变量 功能: 获取为变量分配的总字节数。,例:如果在数据段中定义 ABC DW 100 DUP(?),则 TYPE ABC =2 LENGTH ABC =100 SIZE ABC =100X2=200,属性操作符:这类运

9、算符为存储器操作数临时指定一个新的属性,而忽略当前属性,因此又称属性修改运算符。,1)PTR格式:PTR 地址表达式 功能: 临时指定由地址表达式所确定的存储单元的类型属性。类型可以是BYTE、WORD、DWORD、 NEAR或FAR。,如果定义 ARY DW 100,将ARY定义为字类型变量,为将ARY的低位字节传送到AL,可用PTR临时指定ARY的类型属性,即执行语句 MOV AL,BYTE PTR ARY 注意,本语句不更改ARY变量原有的类型属性(即字类型属性)。,2)THIS格式:THIS 类型 功能:指定变量或标号的类型。类型可以是BYTE, WORD,DWORD,NEAR,FAR

10、,被指定变量或标号的段地址和偏移地址与下一个存储单元地址相同。 例如 WA EQU THIS WORD BA DB 100 DUP(?) 此时,变量WA的段地址和偏移地址与变量BA相同,但类型属性不同(WORD),而后者的类型为字节(BYTE)。,3)段跨越前缀 格式:段寄存器:地址表达式 功能:用来改变地址表达式的段属性。 例如 MOV AX,ES:BX+ SI,第四部分是注释,由分号“;”开始。,数据定义及存储分配伪指令 格式:变量名 DB/DW/DD/DQ/DT ;注释,伪指令,DUP常用在数据定义伪指令中,其使用的格式为: 变量名 DB/DW/DD/DQ/DT DUP(表达式2);注释

11、,例: A1 DB 10,10H ;定义两个字节 A2 DW 10,10H ;定义两个字 A3 DB AB ;定义两个字节 A4 DW AB ;定义一个字 A5 DB 2 DUP(1,2,3) 结果见例LI.ASM,等值(赋值)语句EQU 格式:符号名 EQU 表达式 等号语句= 格式:符号名 = 表达式,注意:用EQU和= 定义的符号不占存储单元。,ORG伪指令,格式:ORG 表达式 功能:位置指针-表达式的值。 其中,表达式的值是一个无符号数,取值范围为065535。汇编程序在汇编过程中将要用到一个位置指针(亦称地址计数器,其中的值用$表示),它用来告诉汇编程序下一个可分配给指令或数据的存

12、储单元地址(偏移地址)。ORG伪指令用于控制(或修改)当前位置指针的内容。,则变量VECT1的偏移地址为10H,而VECT2的偏 移地址为1AH。这里,$等于0012H(即当前地址指针)。该数据定义段经汇编后,内存中DAT数据段分配情况如图所示。,段定义伪指令SEGMENT/ENDS 格式: 段名 SEGMENT 定位类型 组合类型 类别 ;段内语句序列 段名 ENDS,标号定义伪指令LABEL 格式: 变量名或标号名 LABEL 类型 LABEL伪指令常用来对已具有变量名或标号名的存储单元另起一个新的变量名或标号,这个新名的段属性和偏移量属性跟原名相同,但类型属性取决于LABEL后的“类型”

13、。,段寻址伪指令ASSUME 该伪指令用来告诉汇编程序某个段是使用哪一个段寄存器。 格式: ASSUME 段寄存器名:段名,段寄存器名:段名, 功能:设定源程序中各段与段寄存器之间的关系,过程定义伪指令 定义子程序的格式为: 过程名 PROC NEAR/FAR RET 过程名 ENDP,程序结束伪指令END 源程序结束伪指令表示一个程序模块的结束,其格式为: END 标号 其中,“标号”是程序中第一条要被执行指令的标识符,它用来指示程序执行时的起始地址。,程序设计步骤,指令或语句就是告诉计算机为完成某一计算步骤需要执行的操作。程序是为了求解某个问题所必须的完整的指令序列或语句串加上必要的数据。

14、程序设计是编写程序的过程。,当在设计一个程序时,应该考虑满足以下目标: 1)程序的正确性。 2)增强程序的可读性。 3)所写程序应该是结构化的,易修改,易调试,即程序的可维护性。,程序设计的基本步骤 1. 分析问题,建立模型,例:Y=|X|,4分配存储空间和工作单元 5编写程序 6上机调试、运行程序,2确定算法 3根据算法画出程序流程图,程序的基本结构,程序是指令(语句)的有序集合,是对系统任务处理步骤的描述。程序的执行是有一定顺序的,依据执行顺序可将程序分为如下基本结构:顺序结构、分支(选择)结构、循环结构和子程序结构。,顺序结构:是一种线性结构,这种结构的程序每执行一次,其中的语句或程序段

15、依次被执行一次程序的顺序结构如图所示:,其中S1、S2、S3表示顺序执行的语句或程序段。,例6-4 假设由下列数学公式: Y=X3+8X2+8X+6 试编写当X=10时,计算Y值的程序。,Y=(X+8)X+8)X+6,START: MOV AX,STACK_SEG MOV SS,AX MOV SP,OFFSET TOP PUSH DS SUB AX,AX PUSH AX MOV AX,DATA_SEG MOV DS,AX MOV AX,X ADD AX,8 MUL X ADD AX,8 MUL X ADD AX,5 MOV Y,AX RET MAIN ENDP CODE_SEG ENDS EN

16、D START,DATA_SEG SEGMENT X DW 10 Y DW 0 DATA_SEG ENDS STACK_SEG SEGMENT STACK STACK DW 100 DUP (?) TOP LABEL WORD STACK_SEG ENDS CODE_SEG SEGMENT MAIN PROC FAR ASSUME CS:CODE_SEG,DS:DATA_SEG ASSUME SS:STACK_SEG,data segment ;数据段 msg db 0dh,0ah,07h,Hello$ data ends ss_seg segment ;堆栈段 db 256 dup(?) s

17、s_seg ends code segment ;代码段 assume cs:code,ds:data,ss:ss_seg main proc far push ds ;标准序 mov ax,0 push ax mov ax,data ;设置数据段 mov ds,ax lea dx,msg ;取字符串地址,执行后显示HELLO。,mov ah,09h;显示字符串 int 21h ret ;返回操作系统 main endp code ends end main,在计算机上运行汇编语言程序的步骤: (1)编辑程序建立源程序文件(.ASM)。(2)用汇编程序(MASM或ASM)把源文件(.ASM)汇

18、编成目标文件(.OBJ)。(3)用连接程序(LINK)把目标文件(.OBJ)转换成可执行文件。(4)在DOS命令状态下通过直接键人文件名执行该汇编语言程序或利用DEBUG程序对用户程序进行调试。,文件名.ASM 文件名.OBJ 文件名.EXE,汇编语言 源程序,汇编,目标 程序,连接,执行 程序,编辑程序 EDIT.EXE 或记事本,汇编程序 MASM.EXE,连接程序 LINK.EXE,用汇编语言编写源程序,经过汇编程序和连接程序生成目标程序和执行程序,在数据段中存放两个32位二进制无符号数DATA1和DATA2,编制一程序计算两数之和,结果存于RESULT单元中。 title double

19、 word add program data segment data1 dd 1565764587 data2 dd 1293773646 result dd ? data ends ss_seg segment db 100 dup(0) ss_seg ends code segment assume cs:code,ds:data,start proc far push ds mov ax,0 push ax mov ax,data mov ds,ax mov ax,word ptr data1 add ax,word ptr data2 mov word ptr result,ax m

20、ov ax,word ptr data1+2 adc ax,word ptr data2+2 mov word ptr result+2,ax ret start endp code ends end start,显示存储单元内容 在数据段中有一个字节变量,试编程显示该变量内容。 data segment var db 100 data ends sta_seg segment db 256 dup(?) sta_seg ends code segment assume cs:code,ds:data main proc far push ds mov ax,0 push ax mov ax,

21、data mov ds,ax mov al,var,mov dh,al mov cl,4 shr al,cl call ubasc call pchar mov al,dh call ubasc call pchar ret main endp pchar proc mov ah,02h mov dl,al int 21h ret pchar endp,ubasc procand al,0fhadd al,90hdaaadc al,40hdaaretubasc endpcode endsend main说明:1、内存中变量以二进制形式存放,显示程序使用ASCII码。2、UBASC是AL中的低四

22、位二进制数转化为ASCII码结果存于Al中。3、显示程序由pchar完成,用02H系统功能调用,将AL中的ASCII显示输出。,分支程序:具有两个或两个以上相对独立的程序段,每执行一次分支程序,其中有且仅有一个程序段被执行一次。,汇编语言中实现分支的要素有二: (1)使用能影响状态标志的指令,如算术运算指令、逻辑运算指令和移位指令等,利用状态标志来反映条件成立与否。 (2)使用条件转移指令,对状态位进行测试判断,确定程序如何转移,形成分支。,例:编写程序计算Y=X,X,Y为字变量。,CMP AX,0 JGE POS,AND AX,AX JNS POS,DATA SEGMENT X DW 10H

23、 Y DW ? DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START:PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV AX,X TEST AX,8000H JZ POS NEG AX POS: MOV Y,AX RET MAIN ENDP CODE ENDS END START,例:某工厂8种产品的加工程序R0,R1,R7,分别存放在以L0,L1,L7为首址的内存区域中,这8个首址偏移量连续存放在BASE为首址的跳转表内。从键盘上键入产品号,存于AL中,然后利用这个跳转表,由无条件转移指令转到不同的程序段去执行相应的加工程序。,结束,输入产品号I,产品号=07?,输出A,输出B,输出F,Y,N,开始,BASE,L0,L1,L2,L7,DATA SEGMENT BASE DW L0,L1,L2,L3,L4,L5,L6,L7 DATA ENDS CODE SEGMENT ASSUM

温馨提示

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

评论

0/150

提交评论