![[工学]新第4章-汇编语言.ppt_第1页](http://file.renrendoc.com/FileRoot1/2018-12/25/f19a5d31-a428-4902-b82d-f217b10c067e/f19a5d31-a428-4902-b82d-f217b10c067e1.gif)
![[工学]新第4章-汇编语言.ppt_第2页](http://file.renrendoc.com/FileRoot1/2018-12/25/f19a5d31-a428-4902-b82d-f217b10c067e/f19a5d31-a428-4902-b82d-f217b10c067e2.gif)
![[工学]新第4章-汇编语言.ppt_第3页](http://file.renrendoc.com/FileRoot1/2018-12/25/f19a5d31-a428-4902-b82d-f217b10c067e/f19a5d31-a428-4902-b82d-f217b10c067e3.gif)
![[工学]新第4章-汇编语言.ppt_第4页](http://file.renrendoc.com/FileRoot1/2018-12/25/f19a5d31-a428-4902-b82d-f217b10c067e/f19a5d31-a428-4902-b82d-f217b10c067e4.gif)
![[工学]新第4章-汇编语言.ppt_第5页](http://file.renrendoc.com/FileRoot1/2018-12/25/f19a5d31-a428-4902-b82d-f217b10c067e/f19a5d31-a428-4902-b82d-f217b10c067e5.gif)
已阅读5页,还剩114页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章:汇编语言程序设计,汇编语言的特点 汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数 利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序 在有些应用领域,汇编语言的作用是不容置疑和无可替代的 汇编程序设计的过程是与其他高级语言程序设计大致相同,第4章:教学重点,汇编语言源程序格式与开发 常量、变量和标号 汇编语言程序设计方法 顺序程序设计 分支程序设计 循环程序设计 子程序设计,第4章:4.1 汇编语言源程序格式,完整的汇编语言源程序由段组成 一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列 需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点 所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内 通常,程序还需要一个堆栈段,源程序由语句序列构成,第4章:汇编语言的语句格式,执行性语句执行性语句用于表达处理器指令(也称为硬指令),汇编后对应一条指令代码。由处理器指令组成的代码序列是程序设计的主体 标号: 硬指令助记符 操作数,操作数 ;注释 说明性语句说明性语句用于表达伪指令,指示源程序如何汇编、变量怎样定义、过程怎么设置等 名字 伪指令助记符 参数,参数, ;注释,第4章:硬指令与伪指令,硬指令(Instruction)使CPU产生动作、并在程序执行时才处理的指令 硬指令就是第3章学习的处理器指令,与具体的处理器有关、与汇编程序无关 伪指令(Directive)不产生CPU动作、在程序执行前由汇编程序处理的说明性指令 伪指令与具体的处理器类型无关,但与汇编程序有关。不同版本的汇编程序支持不同的伪指令,硬指令和伪指令采用易于记忆的符合表达,这就是助记符,第4章:标号、名字与标识符,标号是反映硬指令位置(逻辑地址)和属性的标识符,后跟一个冒号分隔 名字是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号 标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如 _、$、?、)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写 一个源程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的保留字,第4章:保留字,保留字(Reserved Word)是汇编程序已经利用的标识符(也称为关键字),主要有: 硬指令助记符例如:MOV、ADD 伪指令助记符例如:DB、DW 操作符例如:OFFSET、PTR 寄存器名例如:AX、CS 预定义符号例如:data,汇编语言大小写不敏感,第4章:操作数和参数,处理器指令的操作数可以是立即数、寄存器和存储单元 伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔,第4章:注释,语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性 必要时,一个语句行也可以由分号开始作为阶段性注释 汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理,第4章:分隔符,语句的4个组成部分要用分隔符分开 标号后用冒号,注释前用分号 操作数之间和参数之间使用逗号分隔 其他部分通常采用空格或制表符 多个空格和制表符的作用与一个相同 MASM支持续行符 “”,第4章:例4.1 在屏幕上显示一段信息,;数据段(定义要显示的字符串) string dbHello, Assembly !,0dh,0ah,$ ;代码段(显示字符串的程序) mov dx,offset string mov ah,9 int 21h,Hello, Assembly !,第4章:简化段定义格式,.model small ;定义程序的存储模式(小型模式) .stack ;定义堆栈段(默认是1KB空间) .data ;定义数据段 ;数据定义 .code ;定义代码段 start: mov ax,data ;程序起始点 mov ds,ax ;设置DS指向用户定义的数据段 ;程序代码 mov ax,4c00h int 21h ;程序结束点,返回DOS ;子程序代码 end start ;汇编结束,同时指明程序起始点start,第4章:第一个源程序文件sample01.asm,;sample01.asm .model small .stack .data string db Hello, Assembly !,0dh,0ah,$ .code start: mov ax,data mov ds,ax mov dx,offset string mov ah,9 int 21h mov ax,4c00h int 21h end start,第4章: 汇编语言程序的开发过程(附录B),源程序:文件名.asm,目标模块:文件名.obj,可执行文件:文件名.exe,错误,第4章:第一个源程序文件sample01.asm,;sample01.asm .model small .stack .data string db Hello, Assembly !,0dh,0ah,$ .code start: mov ax,data mov ds,ax mov dx,offset string mov ah,9 int 21h mov ax,4c00h int 21h end start,第4章:简化段定义的源程序格式,.model small ;小型模式存储模式 .stack ; 1KB空间堆栈段 .data ;数据段 ;数据定义 .code ;代码段 start: mov ax,data ;起始点 mov ds,ax ;设置DS ;程序代码 mov ax,4c00h int 21h ;结束点,返回DOS ;子程序代码 end start ;汇编结束,第4章:完整段定义格式,完整段定义利用SEGMENT和ENDS一对伪指令定义逻辑段 同时需要配合ASSUME伪指令指明逻辑段是代码段、堆栈段、数据段还是附加段 完整段定义的优势是可以指明逻辑段的定位、组合、类别等属性;而简化段定义只能采用系统默认的属性 完整段定义和简化段定义的实质是一致的,第4章:可执行程序的结构,DOS操作系统支持两种可执行程序结构 1. EXE程序 程序可以有多个代码段和多个数据段,程序长度可以超过64KB 通常生成EXE结构的可执行程序 2. COM程序 只有一个逻辑段,程序长度不超过64KB 需要满足一定条件才能生成COM结构的可执行程序(MASM 6.x需要采用TINY模式),第4章:4.2 常量、变量和标号,汇编语言的数据可以简单分为常量和变量 常量可以作为硬指令的立即数或伪指令的参数,变量主要作为存储器操作数 汇编语言语句中的名字和标号具有逻辑地址和类型属性,主要用做地址操作数,也可以作为立即数和存储器操作数 本节将详细讨论语句中的参数和操作数、名字和标号,并引出相关的伪指令和操作符,第4章:常量,常量表示一个固定的数值,它又分成多种形式 常数 字符串 符号常量 数值表达式,第4章:1. 常数,指由10、16、2和8进制形式表达的数值,各种进制的数据以后缀字母区分,默认不加后缀字母的是十进制数,第4章:2. 字符串,字符串常量是用单引号或双引号括起来的单个字符或多个字符 其数值是每个字符对应的ASCII码值 例如: d(等于64H) AB(等于4142H) Hello, Assembly !,第4章:3. 符号常量,符号常量使用标识符表达一个数值 MASM提供等价机制,用来为常量定义符号名 符号定义伪指令有“等价EQU”和“等号”: 符号名 EQU 数值表达式 符号名 EQU ;MASM 5.x不支持 符号名 数值表达式 EQU用于数值等价时不能重复定义符号名,但“”允许有重复赋值。例如: X = 7 ;等效于:X equ 7 X = X+5 ;“X EQU X+5”是错误的,第4章:4. 数值表达式,数值表达式一般是指由运算符连接的各种常量所构成的表达式 汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也是常量 表达式的数值在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就能确定 汇编语言支持多种运算符 我们经常使用的是加减乘除( * / ) 例如: mov ax,3*4+5 ;等价于:mov ax,17,第4章:变量,变量实质上是指内存单元的数据,虽然内存单元地址不变,但其中存放的数据可以改变 变量需要事先定义才能使用 变量定义(Define)伪指令为变量申请固定长度为单位的存储空间,并可以同时将相应的存储单元初始化 定义后的变量可以利用变量名等方法引用其中的数据,即变量的数值,第4章:1. 变量的定义,变量定义的汇编语言格式为: 变量名 伪指令 初值表 变量名为用户自定义标识符,表示初值表首元素的逻辑地址,常称为符号地址。变量名也可以没有 初值表是用逗号分隔的参数,主要由常量、数值表达式或“?”组成。其中“?”表示未赋初值 多个存储单元如果初值相同,可以用复制操作符DUP进行定义: 重复次数 DUP(重复参数) 变量定义伪指令有DB、DW、DD等(表3.5),第4章:字节变量的定义DB(Define Byte),DB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值 初值表中每个数据一定是字节量,存放一个8位数据: 可以是0255的无符号数 或是128127带符号数 也可以是字符串常数,实例,字节变量定义实例,;数据段 X db a,-5 db 2 dup(100),? Y db ABC,应用,第4章:字节变量的应用,mov al,X ;此处X表示它的第1个数据,故ALa dec X+1 ;对X为始的第2个数据减1,故成为6 mov Y,al ;现在Y这个字符串成为 aBC,第4章:字变量的定义DW(Define Word),DW伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值 初值表中每个数据是字量,一个字单元可用于存放任何16位数据: 一个段地址 一个偏移地址 两个字符 065535之间的无符号数 3276832767之间的带符号数,字变量定义实例,;数据段 count dw 8000h,?,AB maxint equ 64h number dw maxint array dw maxint dup(0),第4章:双字变量的定义DD(Define Double word),DD伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值 初值表中每个数据是一个32位的双字量: 可以是有符号或无符号的32位整数 也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针 vardd DD 0,?,12345678h farpoint DD 00400078h,第4章:2. 变量的应用,变量具有存储单元的逻辑地址 程序代码中 通过变量名引用其指向的首个数据 通过变量名加减位移量存取以首个数据为基地址的前后数据,例题3.2 变量的定义和应用,第4章:例题2 变量的定义,;数据段 bvar1 db 100,01100100b,64h,d ;字节变量:不同进制表达同一个数值,内存中有4个64H minint = 5 ;符号常量:minint数值为5,不占内存空间 bvar2 db -1,minint,minint+5 ;内存中数值依次为FFH,5,0AH db ?,2 dup(20h) ;预留一个字节空间,重复定义了2个数值20H wvar1 dw 2010h,4*4 ;字变量:两个数据是2010H、0010H,共占4个字节 wvar2 dw ? ;wvar2是没有初值的字变量,第4章:例题2 变量的定义(续),dvar dd 12347777h,87651111h,? ;双字变量:2个双字数据,一个双字空间 abc db a,b,c,? ;定义字符,实际是字节变量 maxint equ 0ah ;符号常量:maxint10 string db ABCDEFGHIJ ;定义字符串:使用字节定义DB伪指令 crlfs db 13,10,$ ;回车符0DH、换行符0AH和字符$24H array1 dw maxint dup(0) ;10个初值为0的字量,可以认为是数组 array db 2 dup(2,3,2 dup(4) ;6个字节内容依次为:02 03 04 04 02 03 04 04,第4章:例题2 变量的应用,;代码段 mov dl,bvar1 ;DL100 dec bvar2+1 ;bvar2+14 mov abc3,dl ;abcabcd mov ax,word ptr dvar0 ;取双字到DX.AX mov dx,word ptr dvar2 add ax,word ptr dvar4 ;加双字到DX.AX adc dx,word ptr dvar6 mov word ptr dvar8,ax ;保存双字的求和结果 mov word ptr dvar10,dx,第4章:例题2 变量的应用(续),mov cx,maxint ;CX10 mov bx,0 ;BX0 again: add stringbx,3 ;string每个数值加3 inc bx loop again ;循环 lea dx,abc ;从abc开始 mov ah,9 ;09H号DOS功能调用 int 21h ;显示结果:abcdDEFGHIJKLM,第4章:3. 变量的定位,汇编程序按照指令的先后顺序一个接着一个分配存储空间,按照段定义伪指令规定的边界定位属性确定每个逻辑段的起始位置(包括偏移地址) 定位伪指令ORG控制数据或代码所在的偏移地址 ORG 参数 ORG伪指令是将当前偏移地址指针指向参数表达的偏移地址。例如: ORG 100h ;从100H处安排数据或程序 ORG $+10 ;偏移地址加10,即跳过10个字节空间 汇编语言程序中,符号“$”表示当前偏移地址值,第4章:名字和标号的属性,名字和标号是用户自定义的标识符。名字指向一条伪指令,标号指向一条硬指令。名字和标号一经使用便具有两类属性: 逻辑地址名字和标号对应存储单元的逻辑地址,含有段地址和偏移地址; 类型变量名的类型可以是BYTE(字节)、WORD(字)和DWORD(双字)等;标号、段名、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间调用 汇编程序提供有关的操作符,以便获取这些属性值,第4章:1. 地址操作符,地址操作符取得名字或标号的段地址和偏移地址,第4章:1. 地址操作符,(1)SEG 返回变量或者标号的段地址 MOV AX,SEG BUFF 返回变量BUFF的段地址。 (2)OFFSET 返回变量或者标号的偏移地址 MOV AX,OFFSET BUFF 返回变量BUFF的偏移地址。 与LEA指令的区别 OFFSET由汇编程序在汇编阶段求得变量的偏移地址;而LEA直接由CPU执行有效地址传送指令完成。,第4章:2. 类型操作符,类型操作符对名字或标号的类型属性进行设置 类型名 PTR 名字/标号 其中可以是BYTE、WORD、DWORD(依次表示字节、字、双字)等,或者是NEAR、FAR(分别表示近、远),还可以是由结构、记录等定义的类型 对变量: TYPE 操作符求出变量或标号的类型:变量:1字节, 2字型,4双字;标号:-1NEAR,-2FAR; LENGTHOF操作符获知某变量名指向多少个数据项 SIZEOF操作符获知它共占用多少字节空间 SIZE=TYPE*LENGTH,第4章:2. 类型操作符,THIS操作符 THIS 类型(或属性) 可以像PTR一样建立一个指定类型或距离的存储器地址操作数,但并不为其分配存储单元,所建立的操作数的段地址和偏移地址与下一个存储单元地址相同。 FIRST EQU THIS BYTE SECOND DW 100 DUP(?) FIRST与SECOND的偏移地址完全相同,但前者是字节型,后者是字型。,第4章:3.段定义语句,1、段定义语句格式 段名 SEGMENT 定位类型组合类型类型 . 段名 ENDS 定位类型:表示此段在内存中的边界要求 PAGE(页:段地址被256整除,即十六进制的最后两位为0);PARA(段:段地址被16整除,即十六进制最后一位为0,省略时为此类型);WORD(字:段地址为偶数值),BYTE(边界从任何地址开始)。 组合类型:标识本段与其他段的关系 NONEPUBLICCOMMONSTACKMEMORYAT 类别:链接程序把同类别的段集中在一起,第4章:3.段定义语句,ASSUME段假设语句 在汇编时提供正确的段码,使汇编程序知道程序的段结构,在各种指令执行时该访问哪一段。 ASSUME 段寄存器:段名, 仅用来指定某段分配给哪个段寄存器,并不能把段地址装入寄存器中。 PUBLIC 和 EXTRN伪指令 实现对程序模块的操作。 过程定义语句 PROC、RET 和ENDP 结束语句 END 和 END 标号,第4章:顺序程序设计,没有分支、循环等转移指令的程序,会按指令书写的前后顺利依次执行,这就是顺序程序 顺序结构是最基本的程序结构 完全采用顺序结构编写的程序并不多见,例题3.4 顺序程序设计实例 采用查表法,实现一位16进制数 转换为ASCII码显示,第4章:顺序程序设计举例,DATA SEGMENT BLOCK DW 0ABCDH BUFF DD ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV DX,BLOCK MOV AX,DX AND AX,0F0FH AND DX,0F0F0H MOV CL,4 SHR DX,CL,LEA BX,BUFF MOV BX+0,AL MOV BX+1,DL MOV BX+2,AH MOV BX+3,DH MOV AX,4C00H INT 21H CODE ENDS END START,第4章:例4 数据段,;数据段 ASCII db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h ;对应0 9的ASCII码 db 41h,42h,43h,44h,45h,46h ;对应A F的ASCII码 hex db 04h,0bh ;假设两个数据,第4章:例4 代码段,;代码段 mov bx,offset ASCII ;BX指向ASCII码表 mov al,hex ;AL取得一位16进制数 ;恰好就是ASCII码表中的位移 and al,0fh ;只有低4位是有效的,高4位清0 xlat ;换码:ALDS:BXAL,XLAT,第4章:例4 代码段(续),mov dl,al ;入口参数:DLAL mov ah,2 ;02号DOS功能调用 int 21h ;显示一个ASCII码字符 mov al,hex+1 ;转换并显示下一个数据 and al,0fh xlat mov dl,al mov ah,2 int 21h,XLAT,第4章:分支程序设计,分支程序根据条件是真或假决定执行与否 判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志 转移指令Jcc和JMP可以实现分支控制 分支结构有 单分支结构 双分支结构 多分支结构,第4章:单分支结构,条件成立跳转,否则顺序执行分支语句体 注意选择正确的条件转移指令和转移目标地址,实例:求绝对值,第4章:计算AX中有符号数的绝对值,cmp ax,0 jge nonneg ;条件满足(AX0),转移 neg ax ;条件不满足,求补 nonneg: mov result,ax ;条件满足,;不恰当的分支 cmp ax,0 jl yesneg ;条件满足(AX0),转移 jmp nonneg yesneg: neg ax ;条件不满足,求补 nonneg: mov result,ax ;条件满足,第4章:双分支结构,条件成立跳转执行第2个分支语句体,否则顺序执行第1个分支语句体 注意第1个分支体后一定要有一个JMP指令跳到第2个分支体后,实例:显示BX的最高位,第4章:显示BX的最高位,shl bx,1 ;BX最高位移入CF标志 jc one ;CF1,即最高位为1,转移 mov dl,30h ;CF0,即最高位为0:DL30H0 jmp two ;一定要跳过另一个分支体 one: mov dl,31h ;DL 31H1 two: mov ah,2 int 21h ;显示,可以用JNC替换JC,第4章:显示BX的最高位(续),shl bx,1 ;BX最高位移入CF标志 jnc one ;CF0,即最高位为0,转移 mov dl,31h ;CF1,即最高位为1:DL31H1 jmp two ;一定要跳过另一个分支体 one: mov dl,30h ;DL 30H0 two: mov ah,2 int 21h ;显示,转换为单分支结构,第4章:显示BX的最高位(另解),mov dl,0 ;DL30H0 shl bx,1 ;BX最高位移入CF标志 jnc two ;CF0,即最高位为0,转移 mov dl,1 ;CF1,即最高位为1:DL31H1 two: mov ah,2 int 21h ;显示,编写分支程序,需留心分支的开始和结束,第4章:显示BX的最高位(无分支),mov dl,0 shl bx,1 ;BX最高位移入CF标志 adc dl,30h ;CF0,DL030h030H0 ;CF1,DL030h131H1 two: mov ah,2 int 21h ;显示,第4章:例题5 显示压缩BCD码,无前导0,;数据段 BCD db 04h ;代码段 mov dl,BCD test dl,0ffh ;如果BCD码为0,显示0 jz zero ;双分支结构 test dl,0f0h ;如果BCD码高位为0,不显示0 jz one ;单分支结构,第4章:例题5 显示压缩BCD码,无前导0(续),mov cl,4 ;处理高位 shr dl,cl or dl,30h ;转换为ASCII码 mov ah,2 ;显示高位 int 21h mov dl,BCD and dl,0fh one: or dl,30h ;处理低位 jmp two zero: mov dl,0 two: mov ah,2 int 21h,第4章:大小写字母转换(参例题3.6),;如果DL是一个小写字母,则转换为大写 cmp dl,a ;小于小写字母a,不需要处理 jb disp cmp dl,z ;大于小写字母z,也不需要处理 ja disp sub dl,20h ;是小写字母,则转换为大写 disp: ,转换原理,第4章:多分支结构,多分支结构是多个条件对应各自的分支语句体,哪个条件成立就转入相应分支体执行,or ah,ah ;cmp ah,0 jz function0 dec ah ;cmp ah,1 jz function0 dec ah ;cmp ah,2 jz function0,第4章: 分支程序设计,MY_D SEGMENT MEMS DB 08H MEMD DB ? MY_D ENDS MY_C SEGMENT ASSUME DS:MY_D,CS:MY_C START:MOV AX,MY_D MOV DS,AX MOV AL,MEMS CMP AL,0 JGE NEXT MOV AL,-1 JMP DONE NEXT: JE DONE,MOV AL,1 DONE: MOV MEMD,AL MOV AX,4C00H INT 21H MY_C ENDS END START,第4章: 循环程序设计,循环程序结构是满足一定条件的情况下,重复执行某段程序 循环结构的程序通常有3个部分: 循环初始部分为开始循环准备必要的条件,如循环次数、循环体需要的数值等 循环体部分指重复执行的程序部分,其中包括对循环条件等的修改程序段 循环控制部分判断循环条件是否成立,决定是否继续循环,关键是什么?,第4章:循环控制,循环结构程序的设计关键是循环控制部分 循环控制可以在进入循环之前进行,也可以在循环体后进行,于是形成两种结构: “先判断、后循环”结构 “先循环、后判断”结构 循环结束的控制可以用循环次数,还可以用特定条件等,于是又有: 计数控制循环 条件控制循环 设定标志结束:循环嵌套,图示,第4章:先循环后判断的循环结构,第4章: 计数控制循环,计数控制循环利用循环次数作为控制条件 易于采用循环指令LOOP和JCXZ实现 初始化:将循环次数或最大循环次数置入CX 循环体 循环控制:用LOOP指令对CX减1、并判断是否为0,第4章: 计数控制循环 -举例(先循环再判断),DATA SEGMENT BUFF DB 67H,9EH,-6AH,0ABH,6DH MEM DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,5 ;设置循环次数 LEA BX,BUFF XOR DL,DL ;统计计数清零 NEXT: MOV AL,BX ADD AL,0 JNS AA1 ;正数,转移,INC DL ;负数加1 AA1: INC BX LOOP NEXT ;循环控制 MOV MEM,DL MOV AX,4C00H INT 21H CODE ENDS END START,第4章:计数控制循环 -举例(先判断再循环),CODE SEGMENT ASSUME CS:CODE START: MOV CX,16 ;循环控制次数 XOR DL,DL :统计计数清零 CMP AX,0 :AX=0? JZ DONE :是0,结束循环 BB1: SHR AX,1 :否则移动AX ADC DL,0 ;统计1的个数 LOOP BB1 DONE: MOV AX,4C00H INT 21H CODE ENDS END START,第4章:用二进制显示BL内容(参例3.8),mov cx,8 ;CX8(循环次数) again: shl bl,1 ;左移进CF,从高位开始显示 mov dl,0 ;MOV指令不改变CF adc dl,30h ;DL030HCF ;CF若是0,则DL 0 ;CF若是1,则DL 1 mov ah,2 int 21h ;显示 loop again ;CX减1,如果CX未减至0,则循环,计数控制循环 先循环后判断,第4章:例9 求数组元素的最大值和最小值,;数据段 array dw 10 ;假设一个数组,其中头个数据10表示元素个数 dw -3,0,20,900,587,-632,777,234,-34,-56 ;这是一个有符号字量元素组成的数组 maxay dw ? ;存放最大值 minay dw ? ;存放最小值,初始化:循环次数元素个数1 循环体:逐个比较求最大、小值 循环控制:比较完所有数据,第4章:例9 代码段,;代码段 lea si,array mov cx,si ;取得元素个数 dec cx ;减1后是循环次数 add si,2 mov ax,si ;取出第一个元素给AX,AX用于暂存最大值 mov bx,ax ;取出第一个元素给BX,BX用于暂存最小值,初始化,第4章:例9 代码段(续),maxck: add si,2 cmp si,ax ;与下一个数据比较 jle minck mov ax,si ;AX取得更大的数据 jmp next minck: cmp si,bx jge next mov bx,si ;BX取得更小的数据 next: loop maxck ;计数循环 mov maxay,ax ;保存最大值 mov minay,bx ;保存最小值,循环体,第4章:条件控制循环,条件控制循环需要利用特定条件判断循环是否结束 条件控制循环用条件转移指令判断循环条件 转移指令可以指定目的标号来改变程序的运行顺序,如果目的标号指向一个重复执行的语句体的开始或结束,便构成了循环控制结构,第4章:条件控制循环 -举例,DATA SEGMENT BLOCK DB ANDEPO139%WR COUNT EQU $-BLOCK MEM DS 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET BLOCK MOV CX,COUNT LOOP1:MOV AL,SI CMP AL,% JZ DONE,INC BYTE PTR MEM INC SI LOOP LOOP1 DONE: MOV AX,4C00H INT 21H CODE ENDS END START,第4章:显示以0结尾的字符串,;数据段 string db Let us have a try !,0 ;代码段 mov bx,offset string again: mov dl,bx cmp dl,0 jz done ;为0结束 mov ah,2 ;不为0,显示 int 21h inc bx ;指向下一个字符 jmp again done: ,条件控制循环 先判断后循环,第4章:例11 记录某个字存储单元数据中1的个数,;数据段 number dw 1110111111100100B ;代码段 mov bx,number xor dl,dl ;循环初值:DL0 again: test bx,0ffffh ;也可以用cmp bx,0 jz done ;全部是0就可以退出循环,减少循环次数 shl bx,1 ;用指令shr bx,1也可以 adc dl,0 ;利用ADC指令加CF的特点进行计数 jmp again,条件控制循环 先判断后循环,第4章:例11 十进制显示(016数值),done: cmp dl,10 ;判断1的个数是否小于10 jb digit ;1的个数小于10,转移 push dx mov dl,1 ;1的个数大于或等于10 mov ah,2 ;则要先显示一个1 int 21h pop dx sub dl,10 digit: add dl,0 ;显示个数 mov ah,2 int 21h,单分支结构,第4章:串操作类指令,8086的串操作类指令能对内存中一个连续区域的数据(如数组、字符串等)进行传送、比较等操作,指令有: 传送数据串:MOVS,STOS,LODS 检测数据串:CMPS,SCAS 重复前缀:REP,REPZ,REPNZ 串操作指令采用了特殊的寻址方式 利用循环程序也可以实现串操作指令的功能,第4章典型汇编程序设计举例,算术运算 在偏移首地址为ARRAY的内存储区有100个字型数据,要求将数组的每个元素加1。 DATA SEGMENT LOOP AA1 ARRAY DW 100 DUP(?) MOV AX,4C00H DATA ENDS CODE ENDS CODE SEGMENT END START ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX LEA BX,ARRAY MOV CX,LENGTH ARRAY AA1: INC WORD PTRBX,1 ADD BX,2,第4章典型汇编程序设计举例,有两个无符号字节型数组,设数组元素个数相等,编程将数组中的对应元素相加,结果存入另一内存区。 DATA SEGMENT M1 DB 20 DUP(?) M2 DB 20 DUP(?) M3 DW 20 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA SI,M1 LEA DI,M2 LEA BX,M3,MOV CX,20 AA1: MOV AL,SI ADD AL,DI MOV BX,AL ADC BYTE PTRBX+1,0 INC SI INC DI ADD BX,2 LOOP AA1 MOV AX,4C00H INT 21H CODE ENDS END START,第4章典型汇编程序设计举例,逻辑处理器 将AL中高、低4位交换 将AX内容按相反的顺序存入DX CODE SEGMENT CODE SEGMENT ASSUME CS:CODE ASSUME CS:CODE START:MOV AL,0ABH START:MOV AX,1234H MOV CL,4 MOV CX,16 ROL AL,CL AA1: SHL AX,1 MOV AX,4C00H RCR BX,1 INT 21H LOOP AA1 CODE ENDS MOV AX,4C00H END START INT 21H CODE ENDS END START,第4章典型汇编程序设计举例,代码转换 将以$结束的字符串中的小写字母改为大写字母 DATA SEGMENT STR DB heLLo,eveRyboDY !,$ DATA ENDS CODE SEGMENT ASSIME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA BX,STR A1: MOV AL,BX CMP AL,$ JE DONE CMP AL,a,JB NEXT CMP AL,z JA NEXT SUB AL,20H MOV BX,AL NEXT: INC BX JMP A1 DONE: MOV AX,4C00H INT 21H CODE ENDS END START,第4章典型汇编程序设计举例,十六进制数到十进制数的转换 SST SEGMENT PARA STACK STACK TOP DW DUP(?) SSL ENDS CODE SEGMENT ASSUME CS:CODE,SS:SST START:MOV AX,SST MOV SS,AX MOV AX,4B6CH MOV CX,0 ;统计除法次数 MOV BX,10 A1: MOV DX,0 ;将被除数扩展为32位 DIV BX PUSH DX ;将转换好的数存入堆栈,INC CX OR AX,AX ;转换直到商为0 JNZ A1 MOV AX,4C99H INT 21H CODE ENDS END START,第4章典型汇编程序设计举例,表格处理 编写程序实现09的数字转换成所要求的密码 0 1 2 3 4 5 6 7 8 9 2 7 1 6 9 0 8 3 4 5 DATA SEGMENT MOV DI,OFFSET VAL2 TABLE DB 2,7,1,6,9,0,8,3,4,5 MOV CX,5 VAL1 DB 8,4,1,7,5 LEA BX,TABLE VAL2 DB 5 DUP(?) A1: MOV AL,SI DATA ENDS XLAT CODE SEGMENT MOV DI,AL ASSUME CS:CODE,DS:DATA INC SI START:MOV AX,DATA INC DI INT 21H MOV DS,AX LOOP A1 CODE ENDS MOV SI,OFFSET VAL1 MOV AX,4C00H END START,第4章典型汇编程序设计举例,串指令题 将偏移地址为STG1、长度为COUNT的数据块,传送到偏移地址为STG2的内存区中。 DATA SEGMENT STG1 DW 25 DUP(?) STG2 DW 25 DUP(?) COUNT EQU 25 DATA ENDS STACK1 SEGMENT PARA STACK STACK DB 100 DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA,MOV DS,AX MOV ES,AX MOV CX,COUNT LEA SI,STG1 LEA DI,STG2 CLD REP MOVSW MOV AX,4COOH INT 21H CODE SEGMENT END START,第4章典型汇编程序设计举例,将BLOCK内存区的带符号字节型数据按照正数、负数分开,并分别存入BUFF1和BUFF2中 DATA SEGMENT BLOCK DB 60 DUP(?) BUFF1 DB 60 DUP(?) BUFF2 DB 60 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,BLOCK LEA DI,BUFF1,LEA BX,BUFF2 MOV CX,60 CLD LOP: LODSB TEST AL,80H JNZ FU STOBS JMP AGAIN FU: XCHG BX,DI STOSB XCHG BX,DI INT 21H AGAIN: LOOP LOP CODE ENDS MOV AX,4C00H END START,第4章典型汇编程序设计举例,按数据大小排序 实现从一串带符号字型数据中找出最大值 DATA SEGMENT BLOCK DW 762EH,6A8BH,-664AH,0B945H,-85DH COUNT EQU ($-BLOCK)/2 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA SI,BLOCK MOV CX,COUNT MOV AX,SI DEC CX,AA1: ADD SI,2 CMP AX,SI JG AA2 MOV AX,SI AA2: LOOP AA1 MOV BX,AX MOV AX,4C00H INT 21H CODE ENDS END START,第4章典型汇编程序设计举例,数据排序 冒泡法将数据两两比较: 冒泡排序的过程:首先比较第一个和第二个数据,将其中较小的数据放到第一个位置,较大的放到第二个位置;然后比较第二个和第三个数据,仍将较小放到后一个位置。依此类推,直到比较第n-1和第n个数据。这样,就将待排序序列中的最大的一个放到了第n个数据,这个过程称为第一趟排序。 下面对前N-1个数据重复这个过程(不用考虑第n个数据,因为它已经是最大的了),又将次大的数据放到了第n-1个位置。一般地,第i趟冒泡排序是对第1个到第n-i+1个数据进行操作,选出原序列第i大的数据放到数组的第n-i+1位置。重复这个过程,直到i=n-1为止。 前一数较大,则不改变位置;否则两数交换,依次将全部数据排序一次-小循环(从小到大) 前一数较小,则不改变位置;否则两数交换,依次将全部数据排序一次-大循环(从大到小),对比原数据经过第一趟排序,实现了什么目的?,第一趟排序,一共进行了多少次比较?,4938,交换位置,原数据和序号,第一趟排序的步骤:,经过第一趟排序,把最大的数沉到最底了!,4965, 保持不变,6597, 保持不变,9776, 交换位置,9713, 交换位置,9727, 交换位置,9749, 交换位置,冒泡法大循环,经过第二趟排序,实现了什么目的?,经过第二趟排序,把第二大的数沉到倒数第二个位置了!,3849,保持不变,第一趟排序后的数据和序号,第二趟排序的步骤:,4965, 保持不变,6576, 保持不变,7613, 交换位置,7627, 交换位置,7649, 交换位置,7697, 保持不变,冒泡法大循环,观察原数据与第一、二趟排序后的数据,问:为了使这一组无序数组完全按照要求排成 从小到大我们还需不需要再继续排序呢?,问:那么我们预计最多一共要经过多少次排序呢?,冒泡法大循环,N个数 ,则要进行 N-1 趟比较。 在第一趟比较中要进行 N-1 次两两比较, 在第 j趟比较中要进行 N-j次两两比较。,从大到小排序,编程实现,一个带符号字节型数据组中的数据按从小到大的顺序排序。 DATA SEGMENT BUFF DB 13,-39,96,84,-75,58 COUNT EQU $-BUFF DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,COUNT-1 LOOP1: MOV DX,CX MOV SI,0 LOOP2: MOV AL,BUFFSI CMP AL,BUFFSI+1,JGE COT XCHG AL,BUFFSI+1 MOV BUFFSI,AL COT: INC SI LOOP LOOP2 MOV CX,DX LOOP LOOP1 MOV AX,4C00H INT 21H CODE ENDS END START,第4章: DOS功能调用与子程序设计,DOS功能: 命令 子程序:磁盘的读/写、控制管理、内存管理、基本输入/输出管理; 所有子程序从1号开始顺序编号,这些编号称为DOS功能调用号。 子程序调用过程: DOS功能调用号送AH寄存器 按要求给定输入参数(有的不需要输入参数) 写入中断指令“INT 21H” 调用结
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业污染场地修复2025年技术方案成本效益分析及环境保护产业政策优化报告
- 自己的商铺租赁合同范本
- 美术合作办学合同协议书
- 社会人员招聘劳动协议书
- 风能叶模板维修合同范本
- 汽修维保合同协议书模板
- 自助美甲店转让合同范本
- 网络通讯协议书结构模板
- 第三方检测合同检测协议
- 砂场工人安全合同协议书
- 2025至2030风力发电用高强度螺栓行业发展趋势分析与未来投资战略咨询研究报告
- 校园绿化具体管理办法
- 重庆市主城区七校联考2024-2025学年高一下学期期末考试生物学试题
- 关于环境安全的论文
- 智慧教育基于大数据的个性化教学研究与实践
- 2025年中国铁路集团招聘笔试备考题库(带答案详解)
- 用工风险培训课件
- 海外现场安全健康环境管理(HSE)
- 无损检测超声波技术应用与原理
- 班主任与科任老师的协调教育
- 2025年广东省中考历史试题卷(含答案详解)
评论
0/150
提交评论