汇编语言部分内容程序设计3.ppt_第1页
汇编语言部分内容程序设计3.ppt_第2页
汇编语言部分内容程序设计3.ppt_第3页
汇编语言部分内容程序设计3.ppt_第4页
汇编语言部分内容程序设计3.ppt_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言程序设计 Assembly Language Programming,第三章 汇编语言程序格式,本章结构,汇编语言程序格式,逻辑段,逻辑段,逻辑段,语句,语句,语句,伪指令语句,指令语句,宏指令语句,指令助记符,操作数,伪指令助记符,寻址方式,表达式,指令助记符,本章结构,汇编语言程序格式,逻辑段,逻辑段,逻辑段,语句,语句,语句,伪指令语句,指令语句,宏指令语句,指令助记符,操作数,伪指令助记符,寻址方式,表达式,指令助记符,1. 汇编语言程序结构,汇编语言源程序由一个或多个逻辑段组成。 一个程序中可以有几个同一类型的逻辑段。 必须至少有一个代码段。 源程序的结束标志“END”语句 注源程序分段的目的在于程序结构清晰、便于内存分配,寻址方便,一个源程序需要设置几个段应根据具体问题来定。,逻辑段,一个逻辑段由若干条汇编语言语句组成 逻辑段的类型 程序段(代码段)主要由指令语句组成,完成源程序的功能。 数据段定义数据及符号的伪指令组成。 附加段定义数据及符号的伪指令组成。 堆栈段定义堆栈伪指令组成。,语 句,语句类型: 指令使CPU产生动作、并在程序执行时才处理的语句,就是第3章学习的处理器指令 伪指令(Directive)不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等 宏指令语句可执行语句,2. 伪指令,伪指令语句非执行语句,用来指示编译器进行编译的语句,没有机器代码对应。 伪指令与具体的处理器类型无关,但与汇编程序的版本有关,伪指令分类,变量定义语句 符号定义语句 LABEL伪指令 段定义语句 段类型说明语句 程序结束伪指令 过程定义语句 起始地址和对准语句 $地址计数器,(1)数据定义语句,格式: 变量 DBDWDD/ DF / DQ / DT 操作数1,操作数n 功能: 定义变量; 在内存中分配一组存储单元; 并对单元进行初始化。 分类 DB:用来定义字节,其后每个操作数占用一个字节。 DW:用来定义字,其后每个操作数占用一个字。 DD:用来定义双字,其后每个操作数占用两个字。 DQ:用来定义四个字,其后每个操作数占用四个字。 DT:用来定义十个字节,其后每个操作数占用十个字节。,操作数,常数或一组常数或数值表达式; 例如:DATA DB 2, 100*2-5, 0, -1 一组字符串 如: STRING DB This is a string,STRING,操作数,变量名 ADDR1 DW BLOCK ;BLOCK偏址放在ADDR1单元 ADDR2 DD BLOCK ;BLOCK的偏址和段址依次存放在ADDR2四字节单元中。 一组“?” 只分配空间,不进行初始化 例如:BLOCK DW ?,? ;分配两个字节,但为随机值,操作数,重复DUP语句 格式:重复数 n DUP(重复内容) 功能:将DUP后的内容重复定义n次。 例如:BLOCK DB 3 DUP (0,1,-1) 如同:BLOCK DB 0,1,-1, 0,1,-1, 0,1,-1 注DUP语句中可以包含DUP语句。,NOTICE,汇编语言强类型! 变量有类型! BUFFER DW 1234H MOV AL, BUFFER MOV AL,BYTE PTR BUFFER MOV AX, BUFFER,(2)符号定义语句EQU,格式: EQU 表达式 符号名符号常数 表达式数值表达式或者字符串 功能: 出现符号的地方进行替换;不分配空间;相当于C语言的Define宏。 例如: XX EQU 1*10-2 DATA EQU 1000H MOV AX,XX*2; 16AX,(2)符号定义语句, 数值表达式 例如: ZERO 0 “EQU”不能对同一个符号进行二次定义,但符号定义为指令“=”可以。,(3) LABEL,格式: 符号名 LABEL 类型 类型:BYTE, WORD,DWORD, ,NEAR,FAR 功能:从当前位置的地址强制转化为“类型”来定义“符号”,并不分配内存空间, 但定义变量或者标号。 例子: databyte label byte dataword dw 1,2,3 ;databyte和dataword地址一样,但是类型不同。 labelfar lable far labelnear: mov al, bl ;labelfar与labelnear地址一样,但是类型不同。 ;Labelfar用于段间转移,(4) 段定义伪操作完整段定义,段名 segment 对齐 组合 类别 . ;语句序列 段名 ends 完整段定义由SEGMENT和ENDS这一对伪指令实现,SEGMENT伪指令定义一个逻辑段的开始,ENDS伪指令表示一个段的结束 段名对外表现为立即数,为该段的段地址 STACK定义堆栈段:自动给SS和SP赋值 段定义指令后的3个关键字用于确定段的各种属性, P186,多模块程序再讲。,(5) 段类型说明伪操作,在代码段开始必须用ASSUME伪操作声明段和寄存器之间的关系,格式为: ASSUME 段寄存器:段名 ,段寄存器名:段名, . 通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系 在明确了程序中各段与段寄存器之间的关系后,汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。这是ASSUME伪指令的主要功能 例如:ASSUME CS:Code, DS:Data, SS:Stack,NOTICE,ASSUME语句位于在程序段开始位置 在ASSUME语句中并没有给段寄存器赋值 为DS、ES、SS赋值的方法: MOV AX, MOV DS/ES/SS,AX 为CS赋值工作由系统自动完成。,DATA1 SEGMENT X DB 1 DATA1 ENDS DATA2 SEGMENT Y DB 2 DATA2 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA1 ,ES:DATA2 START: MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX MOV AL,X MOV AH,Y MOV AH,4CH INT 21H CODE ENDS END START,MOV AH,ES:0000,(6)程序结束伪指令,格式:END 标号 功能:以示汇编源程序到此结束,停止汇编工作。 说明:标号仅在主程序模块的“END”语句中添加,以示执行程序的起始地址,而在子程序模块不需给出,(7) 过程定义伪操作,格式为: 过程名 PROC NEAR/FAR . ;语句序列 过程名 endp 功能:定义一个过程(子程序)。 说明: 就是该子程序的符号名(如同标号)可被“CALL”指令引用。 的类型由PROC后的类型确定; NEAR定义该过程为段内调用过程 FAR定义该过程为段间调用过程。 在子程序段中至少有一条“RET”语句,以便返回主程序。 过程定义放在程序段的尾部 过程既允许嵌套定义又允许嵌套调用,(8)起始地址和对准语句,ORG 格式:ORG 表达式 功能:指定随后指令或者定义数据的偏移地址 说明: “ORG”伪指令可设置程序段、数据段任何位置。 若程序中没有设置“ORG”语句,一般情况每个逻辑的起始地址为0000H。 EVEN 偶地址对齐指令。,(9)地址计数器($),在指令语句和伪指令语句中,常常引用$符号作为地址计数器,它用以表示当前正在汇编的指令地址。在汇编过程中,$的值在不断发生变化,即$在程序中不同的位置其值是不同的。 例如: ORG 100H ARRAY DW 1, $ , 2+$ ,4-5 SUM DW $ DS:0100H 01 00 02 01 06 01 FF FF 08 01,符号地址 操作 操作数 ; 注释 ,变量 指令 寄存器 说明程序 分 标号 伪指令 标号 或语句 行 宏指令 变量 的功能 符 常数 表达式,3. 语句,标号,标号 标号一个指令单元的符号地址。 标号的书写格式:不能使用系统保留字、不能以数字开头 标号的定义:在一条指令语句前输入标号且用“:”隔开,即定义了该标号;或用Label来定义 标号的属性: 段属性是指定义标号所在段的段地址。 偏移属性是指定义标号处到段地址的距离。 类型属性NEAR型和FAR型。,变量,变量 变量是指数据单元的符号地址。 变量的书写格式:不能使用系统保留字、不能以数字开头 变量的定义:用数据定义伪指令来定义 变量的属性: 段属性变量的段地址 偏移属性变量的偏移地址 类型属性变量所指单元的类型 变量的类型:字节变量、字变量、双字变量等 所以: MOV Data,1,操作数,常数 数常数二进制(B)、十进制(D)、十六进制(H) 字符常数如:ABC、100A、This is a book. (单双引号都可,ASCII) 符号常数代表一个常数的符号 寄存器数 内存数变量 表达式,表达式,地址表达式由“变量、标号“+”、“-” ”数值表达式组成。 如:DATA+5,VARYBX 注含有变量的地址表达式其类型与该变量一致,如VARYBX,VARY4与VARY类型一样。 数值表达式用常数、符号常数和算术、逻辑、关系运算符组成的表达式。如:(75*2+X)/Y,表达式,运算符 算术运算符 逻辑运算符 关系运算符 操作符 分析操作符:SEG、OFFSET、TYPE、SIZE、LENGTH 合成操作符:SHORT、段操作符、THIS 、PTR,算术运算,算术运算符包括:(加)、(减)、*(乘)、(除)、MOD(求模)几种,它既可以用于数值表达式又可用于地址表达式。 例如: MOV AL, 25*4 50 MOV DL, 10 MOD 3,逻辑运算符,逻辑运算符包括:逻辑乘(AND)、逻辑加(OR)、按位加(XOR)、逻辑非(NOT)、 )、SHL(左移)、SHR(右移)运算。 例如: MOV AL,34H AND 0FH ;04HAL MOV BL,05H OR 30H ;35HBL MOV CX,NOT 00FFH ;0FF00HCX MOV DX,789AH XOR 000FH ;7895HDX MOV DH, 1 SHL 4 ; 00010000BDH MOV DL, 0FFH SHR 1 ; 7FHDL,关系运算符,关系运算符包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE) 关系成立0FFFFH,如:5 GT 0=0FFFFH 关系不成立0000H,如:5 LE 0=00H 例如: MOV AX, 2 EQ 2 ;0FFFFHAX MOV BL, 1 GT 1 ;00HBL,合成操作符,类型 PTR 表达式 例: MOV WORD PTR BX, 5 段操作符:段超越 例: MOV ES: BX, AL SHORT 标号 例: JMP SHORT NEXT THIS 类型 例: TA EQU THIS BYTE TB DW 100 DUP (?) NEXT EQU THIS FAR MOV CX, 100 字节分离操作符 例: CONS EQU 1234H HIGH MOV AH, HIGH CONS LOW MOV AL, LOW CONS,分析操作符,SEG 运算符 OFFSET运算符 TYPE运算符 LENGTH运算符 SIZE运算符,(1)SEG 运算符 格式:SEG 变量或标号 功能:分离出其后变量或标号所在段的段首址。 例如: MOV AX,SEG ARR MOV DS,AX (2)OFFSET运算符 格式:OFFSET 变量或标号 功能:分离出其后变量或标号的偏移地址。 例如: MOV BX,OFFSET BUF,(3)TYPE运算符 格式:TYPE 变量或标号 功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。它们之间的关系见表3.2所示。,(4)LENGTH运算符 格式:LENGTH 变量 功能:取出变量所含的数据存储单元个数。 (5)SIZE运算符 格式: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, 1 MOV CX, SIZE ARRAY ; MOV CX, 200 MOV CX, SIZE TABLE ; MOV CX, 1,运算符的优先级,4. 汇编语言程序框架(一),Stack segment stack dw 512 dup(?) Stack ends Data segment . ;在数据段定义数据 Data ends Code segment assume cs:code, ds:data, ss:stack start: mov ax,data mov ds,ax . ;在代码段填入指令序列 mov ah,4ch int 21h . ;子程序代码 Code ends end start,汇编语言程序框架(二),Data segment . ;在数据段定义数据 Data ends Code segment main proc far assume cs:code, ds:data push ds xor ax,ax push ax mov ax,data mov ds,ax . ;在代码段填入指令序列 ret main endp . ;子程序代码 Code ends end start,汇编语言程序框架简化,采用简化的段定义方式 编写更方便,但是功能没有完整段定义强大 简化段定义方式 简化的汇编语言程序框架,简化段定义伪指令,.8086 ; CPU .Model small ; 内存模型 .STACK 大小 ;堆栈段开始 .DATA ;数据段开始 .DATA? ;临时分配变量 .CONST ;常量 .CODE 段名 ;代码段开始 .STARTUP ;开始 .EXIT 返回参数 ;结束 简化段定义伪指令指明一个逻辑段的开始,同时自动结束前面的一个段 使用简化段定义,各段名称和其他用户所需的信息可以使用MASM预定义符号,例如:data表示由.data等定义的数据段的段名,处理器选择伪操作,.8086 选择 8086 指令系统 .286 选择 80286 指令系统 .286P 选择保护模式下的 80286 指令系统 .386 选择 80386 指令系统 .386P 选择保护模式下的 80386 指令系统 .486 选择 80486 指令系统 .486P 选择保护模式下的 80486 指令系统 .586 选择 Pentium 指令系统 .586P 选择保护模式下的 Pentium 指令系统 *MASM 5.0 支持到.386 *MASM 6.1x全部支持,.MODEL 存储模式,.Model语句必须位于所有段定义语句之前 存储模式决定一个程序的规模,确定进行子程序调用、指令转移和数据访问的缺省属性 MASM有7种不同的存储模式: TINY SMALL COMPACT MEDIUM LARGE HUGE FLAT,TINY微型模式,微型模式是MASM 6.0才引入的用于创建COM类型程序 用微型模式编写汇编语言程序时,所有的段地址寄存器都被设置为同一值 这意味着代码段、数据段、堆栈段都在同一个段内,不大于64KB;访问操作数或指令都只需要使用16位偏移地址,SMALL小型模式,在小型模式下,一个程序至多只能有一个代码段和一个混合段,每段不大于64KB 混合段是指数据段、堆栈段和附加段的总和,它们共用同一个段基址,总长度不可超过64KB;因此小模式下程序的最大长度为128KB 访问操作数或指令都只需要使用16位偏移地址;这意味着诸如指令转移、程序调用以及数据访问等都是近属性(NEAR),COMPACT紧凑模式,适合于数据量大但代码量小的程序 紧凑模式下,代码段被限制在一个不大于64KB的段内;而数据段则可以有多个,超过64KB 这种模式下的调用类型缺省仍为近调用;而数据指针缺省为远(FAR)指针,因为必须用段地址来区别多个数据段,MEDIUM中型模式,中型模式是与紧凑模式互补的模式 适合于数据量小但代码量大的程序 中型模式的代码段可以超过64KB,有多个;但数据段只能有一个 这种模式下的数据指针缺省为近指针;但调用类型缺省是远(FAR)调用,因为要利用段地址区别多个代码段,LARGE 、HUGE模式,较大型程序通常采用的存储模式 大型模式允许的代码段和数据段都有多个,都可以超过64KB;但全部的静态数据(不能改变的数据)仍限制在64K字节内 大型模式下的调用类型和数据指针缺省分别为远调用和远指针 HUGE(巨型模式)与大型模式基本相同,只是静态数据不再被限制在64K字节之内,FLAT平展模式,平展模式用于创建一个32位的程序 它只能运行在32位x86 CPU上,总 结,TINY模式产生COM程序,其他模式产生EXE程序,FLAT模式只能用于32位程序 DOS下编程可选择前六种模式,一般可以选用SMALL模式 DOS下不能使用FLAT模式,而编写32位Windows 9.x或Windows-NT的程序时,必须采用FLAT模式。,简化段定义伪指令,.STACK 大小 堆栈段伪指令.STACK创建一个堆栈段,段名是:stack 参数大小指定堆栈段所占存储区的字节数,默认是1KB(= 1024 字节),简化段定义伪指令,.DATA .DATA? . CONST 数据段伪指令.data创建一个数据段,段名是:_DATA。它用于定义具有初值的变量,当然也允许定义无初值的变量 无初值变量可以安排在另一个段中,它用.data?伪指令创建,数据段名是:_BSS . const伪指令用于建立只读的常量数据段(段名:CONST),简化段定义伪指令,.CODE 段名 代码段伪指令.code创建一个代码段,它的参数指定该代码段的段名 如果没有给出段名,则采用默认段名: 在TINY、SMALL、COMPACT和FLAT模式下,默认的代码段名是:_TEXT 在MEDIUM、LARGE和HUGE模式下,默认的代码段名是:模块名_TEXT,简化段定义伪指令,.STARTUP 相当于 mov ax, data mov ds, ax .EXIT 返回参数 产生终止程序执行返回操作系统的指令代码 它的可选参数是一个返回的数码,通常用0表示没有错误。例如.exit 0对应的代码是: mov ax,4c00h int 21h *MASM 5.0不支持 *MASM 6.1x支持,汇编语言程序框架简化1,.model small .stack .data . ;在数据段定义数据 .code start: mov ax,data mov ds,ax . mov ax,4c00h int 21h end start,汇编语言程序框架简化2,.model small ;定义程序的存储模式 .stack ;定义堆栈段 .data ;定义数据段 string db Hello,Everybody !,0dh,0ah,$ .code ;定义代码段 .startup ;程序起始点,建立DS . .exit 0 ;程序结束点,返回DOS end ;汇编结束,5.汇编语言的上机过程,汇编语言程序的上机过程 1、编写源程序 2、将源程序编译为目标程序 3、把目标程序连接为 DOS可执行程序 汇编程序的主要功能是: 1、报告源程序中的语法错误 3、形成目标程序,源程序:文件名.asm,目标模块:文件名.obj,可执行文件:文件名.exe,错误,建立汇编语言的工作环境-MASM 5.x,MASM.EXE LINK.EXE DEBUG.COM 使用: MASM myfile.asm ;编译 LINK myfile.obj ;连接,myfile.asm,编辑程序,汇编程序,连接程序,myfile.crf,otherfiles.obj,myfile.lst,myfile.obj,myfile.map,myfile.exe,编译和连接,MASM,LINK,建立汇编语言的工作环境-MASM 6.1x,ML.EXE LINK.EXE CV.EXE 使用: ML myfile.asm ;编译连接 ML /c myfile.asm ;只编译 ML /Zi myfile.asm ;加入调试信息,建立汇编语言的工作环境-EMU8086,Emu8086 - Microprocessor Emulator with 8086 Assembler Emu8086 is extremely helpful for programming in

温馨提示

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

评论

0/150

提交评论