第四章 汇编语言程序设计 - 图文

更新时间:2024-06-10 13:53:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第四章汇编语言程序设计4.1 汇编语言与汇编程序4.2 伪指令4.3 汇编语言的语法4.4 汇编语言程序的上机过程4.5 汇编语言程序设计4.6 系统功能调用4.7 程序设计举例4.1 汇编语言与汇编程序一、汇编语言概述用指令的助记符、符号地址、标号、伪指令等符号书写的语言。用这种汇编语言书写的程序称为汇编语言源程序面向机器的机器指令计算机硬件的功能扩展和应用二、汇编程序4.1把汇编语言源程序翻译成在机器上能执行的机器语言程序(目标代码程序)的过程叫做汇编,完成汇编过程的系统程序称为汇编程序。编辑程序汇编程序PROGRAM.ASMPROGRAM.OBJ连接程序PROGRAM.EXE在计算机上运行汇编语言程序的步骤:4.11)用编辑程序建立ASM源文件;2)用MASM程序把ASM文件翻译成OBJ文件;3)用LINK程序把OBJ文件转换成EXE文件;4)在DOS命令环境下直接键入文件名执行该程序。4.2 伪指令一、伪指令概述伪指令也称为伪操作,伪指令用于为汇编程序提供某些信息,让汇编程序在汇编过程中执行某些特定的功能。也叫指示性语句。给出目标程序存放的位置、定义存储单元中存放的初始数据、分配存储区、指示程序结束等功能。伪操作不产生任何目标代码。

给出一个完整的汇编语言源程序,该程序的功能是完成两个字节数据相加。4.2DATABUF1BUF2SEGMENTDBDB34H2AH;段定义开始(DATA段);第1个加数;第2个加数SUMDATADBENDS?;准备用来存放和数的单元;段定义结束(DATA段)CODESEGMENT;段定义开始(CODE段)ASSUMECS:CODE,DS:DATA ;规定DATA、CODE分别为数据段;和代码段4.2START: MOVAX,DATAMOVDS,AXMOVAL,BUF1ADDAL,BUF2;给数据段寄存器DS赋值;取第1个加数;和第2个加数相加MOVSUM,ALMOVAH,4CHINTCODEENDSENDSTART21H;存放结果;返回DOS状态;段定义结束(CODE段);整个源程序结束二、常用伪指令1. 段定义伪指令SEGMENT-ENDS4.2Segname SEGMENT [align_type] [combine_type] [use_type] [′class′]…Segname ENDS可选择的段参数有定位类型、组合类型和类别名2. 段寄存器设定伪指令ASSUME定义的段与段寄存器的对应关系CS:CODE,DS:DATA3. 汇编程序结束伪指令ENDENDSTART4. 数据定义及存储器分配伪指令BUF1BUF2SUMDB34HDB2AHDB?;第1个加数;第2个加数4.25. 表达式赋值伪指令EQU / =CONSTANTEQU 256ALPHAEQU 7BETAEQU ALPHA-2;数赋以符号名4.2;地址表达式赋以符号名6. 地址计数器$JNE $+6 ; 转向地址是当前指令JNE的首址+67. 对准伪指令ORG/EVEN/ALIGN1)设置起始地址伪指令ORG ORG 100H;使下一地址是100H

2)EVEN伪操作使下一变量或指令开始于一个偶数字节地址4.2EVEN;使下一地址B从偶地址开始B DW 2 DUP (?);对于字类型地址最好从偶地址开始3)ALIGN伪操作为保证双字数组边界从4的倍数开始创造了条件ALIGN 4ARRAY DD 100 DUP (?);使双字数组边界从4的倍数开始8. 过程定义伪指令PROC-ENDP4.2procedure_name PROC NEAR ( FAR )…procedure_name ENDP1)NEAR属性:调用程序和子程序在同一代码段中,属于段内调用。2)FAR属性:调用程序和子程序不在同一代码段中,为段间调用。4.3 汇编语言的语法一、汇编语言的语句结构[name:]operation operand[;comment]标号操作码操作数注释二、数据与表达式1.算术操作符+、-、?、/和MOD2. 逻辑运算与移位操作符4.3逻辑操作符有AND、OR、XOR、NOT移位操作符有SHL和SHR按位操作3. 关系运算符4.3EQ(相等)、NE(不等)、LT(小于)、LE(小于或等于)、GT(有大于)、GE(大于或等于)6种4. 数值回送操作符TYPE、LENGTH、SIZE、OFFSET、SEG等。这些操作符把一些特征或存储器地址的一部分作为数值回送。1)类型回送操作符TYPETYPEexpression

4.3表达式是变量:回送该变量的以字节表示的类型DB、DW、DD、DQ、DT分别对应变量的类型属性为1、2、4、8、10。表达式是标号:回送代表该标号类型的数值NEAR为-1,FAR为-2表达式为常数:回送02)偏移OFFSET回送操作符回送变量或标号的偏移地址如:MOV BX , OFFSET OPER1等价于:LEA BX ,OPER13)SEG4.3回送变量或标号的段地址值4)LENGTHKKK DW 20 DUP (?) 4.3;汇编程序为变量KKK;分配20个字存储单元。MOV CX ,LENGTH KKK;等价于MOV CX ,205)SIZE 回送分配给该变量的总字节数,是LENGTH 和TYPE值的乘积。4.31.属性操作符(PTR、段操作符、SHORT、THIS、HIGH、LOW)1)PTR type PTR expression更改一些已经规定了类型的存储单元的类型2)段操作符MOV AX ,ES:[BX+SI]3)SHORT 4.3用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址的±127个字节范围内。4)THIS THIS attribute THIS type像PTR一样建立一个指定类型(BYTE、WORD、DWORD)的或指定距离(NEAR、FAR)的地址操作数。

5)字节分离操作符HIGH 和LOWHIGH取其高位字节,LOW取其低位字节4.3CONST EQU 0ABCDHMOV AH , HIGH CONST ;等价于MOV AH ,0AB6. 优先级优先级运算符4.3LENGTH、SIZE、WTDTH、MASK、·、()、< >、[ ]、PTR、OFFSET、SEG、TYPE、THIS、段前缀运算符:HIGH、LOW*、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GENOT12345678910ANDOR、XORSHORT注意:括号内的表达式应优先计算4.4 汇编语言程序的上机过程步骤包括:源程序的录入编辑汇编连接形成可执行程序运行调试4.4编辑程序:如EDIT.EXE汇编程序:如ASM.EXE或MASM.EXE连接程序:如LIKE.EXE调试程序:如DEBUG.COM有时还需要CREF.EXE、EXE2BIN.EXE等文件DEBUG 的命令及使用:参见附录4.5 汇编语言程序设计程序有顺序、循环、分支和子程序四种结构形式流程图的组成成分条件执行框判别框开始开始框结束结束框1连接点指向线

4.5开始①③NY≤0?YX≥0?NY②②结束①一、顺序程序设计4.5顺序程序结构是指完全按顺序逐条执行的指令序列,这在程序段中是大量存在的,但作为完整的程序则很少见,一般作为程序的一部分。顺序结构程序是最简单的程序,在顺序结构程序中,指令按照先后顺序一条一条执行。例:将两个字节数据相加,并存放到一个结果单元中。4.5DATASEGMENTAD1 DB4CHAD2 DB25HSUM DB?DATAENDS;定义第1个加数;定义第2个加数;定义结果单元CODE SEGMENTASSUMECS:CODE,DS:DATA4.5START:MOVAX,DATAMOVMOVADDDS,AXAL,AD1AL,AD2;取出第1个加数;和第2个加数相加MOVMOVMOVSUM,ALBL,ALCL,4;存放结果;显示十六进制结果SHRANDADDMOVAL,CLAL,0FHAL,30HDL,ALMOVAH,24.5INTAND21HAL,0FHMOVAL,BLADDAL,30HMOVDL,ALMOVAH,2INTINTCODEENDSEND21H;返回DOS21HSTARTMOVAH,4CH

4.5计算(25*178+355-360)/25,要求计算结果的商存入BUF单元,余数存入BUF+2单元中。DATA SEGMENTX DW 25Y DW 178Z DW 355BUF DW 2 DUP (?)DATA ENDS;定义数据段;定义源数据;开辟结果单元;数据段结束4.5CODE SEGMENTASSUME DS:DATA, CS:CODE;段约定BEGIN: MOV AX ,DATAMOV DS ,AX;数据段地址送DSMOV AX ,X IMUL Y;DX,AX←X*YMOV CX ,AXMOV BX ,DX;BX,CX←DX,AXMOV AX ,ZCWD;对Z进行符号扩展ADD AX ,CX ADC DX ,BX;DX,AX←X*Y+Z4.5SUB AX ,360SBB DX ,0IDIV X MOV BUF ,AXMOV BUF+2 ,DXMOV AH ,4CHINT 21HCODE ENDSEND BEGIN;DX,AX←X*Y+Z-360;存放商;存余数;返回DOS;程序结束;代码段结束;结束汇编计算结果的商B1H存入BUF单元,余数14H存入BUF+2单元中二、分支程序设计4.5(a)IF_THEN_ELSE语句可以引出两个分支(b)CASE语句则可以引出多个分支判定条件Y判定条件N…(a)(b)4.5程序的分支一般用条件转移指令来产生,利用转移指令不影响条件码的特性,连续地使用条件转移指令可使程序产生多个不同的分支。例:TABLE是一字节数组的首地址,长度为100。统计此数组中正数、0及负数的个数,并分别放在COUNT1、COUNT2和COUNT3变量中。

流程图如下:开始初始化4.5读取一个数据N负数个数加1YY>0?N0个数加1≥0?正数个数加1循环修改NCX=0?Y结束DATASEGMENTTABLEDBCOUNT1 DBCOUNT2 DBCOUNT3 DBDATA ENDSCODESEGMENTASSUMEALLOPROCSTART:PUSHXORPUSHMOVMOV4.5100000DUP(?)CS:CODE,DS:DATAFARDSAX,AXAXAX,DATADS,AXMOV CX,100MOV BX,0AGAIN:CMP TABLE[BX],0JGE SS12INC COUNT3JMP SHORT NEXTSS12:JGSS1INC COUNT1JMP SHORTNEXT SS1:INC COUNT2NEXT:INC BXLOOP AGAINRETALLO ENDPCODEENDSENDSTART4.5例: 编写计算如下分段函数值的程序:10-1;X>0;0=0;X<04.5Y=设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如下:程序如下:DATASEGMENTXDB-10YDB?DATAENDSCODESEGMENTASSUME DS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXCMPX,0;与0进行比较JGEA1;X≥0转A1MOVY,-1;X <0时,-1→YJMPEXITA1:JGA2;X>0转A2MOVY,0;X=0时,0→YJMPEXITA2:MOVY,1;X>0,1→Y EXIT:MOVAH,4CHINT21H ;程序结束点,返回DOSCODEENDSENDSTART4.5

本文来源:https://www.bwwdw.com/article/1ub6.html

Top