汇编语言程序结构.ppt

上传人:牧羊曲112 文档编号:5780486 上传时间:2023-08-19 格式:PPT 页数:102 大小:1.16MB
返回 下载 相关 举报
汇编语言程序结构.ppt_第1页
第1页 / 共102页
汇编语言程序结构.ppt_第2页
第2页 / 共102页
汇编语言程序结构.ppt_第3页
第3页 / 共102页
汇编语言程序结构.ppt_第4页
第4页 / 共102页
汇编语言程序结构.ppt_第5页
第5页 / 共102页
点击查看更多>>
资源描述

《汇编语言程序结构.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序结构.ppt(102页珍藏版)》请在三一办公上搜索。

1、,第一章 基础知识,循环与分支程序设计,1)分析题意,确定算法。这一步是能否编制出高质量程序的关键,因此不应该一拿到题目就急于写程序,而是应该仔细地分析和理解题意,找出合理的算法及适当的数据结构。2)根据算法画出程序框图。这一点对初学者特别重要,这样做可以减少出错的可能性。画框图时可以从粗到细把算法逐步地具体化。3)根据框图编写程序。4)上机调试程序。任何程序必须经过调试才能检查出你的设计思想是否正确以及你的程序是否符合你的设汁思想。在调试程序的过程中应该善于利用机器提供的调试工具(如DEBUG)来进行工作,你会发现它会给你提供很大的帮助。,编制一个汇编语言程序的步骤,分析问题,程序设计的解题

2、基本步骤如下:,顺序、分支、循环程序和子程序的设计是汇编语言程序设计的基本内容。,在此基础上还要掌握汇编语言程序设计的基本方法和技巧,包括递归子程序设计、COM和EXE格式程序的结构和特点、多模块程序设计方法等。,一、汇编语言程序设计的基本方法,概述,概述,二、程序的基本结构 1、顺序结构程序 2、分支结构程序 3、循环(重复)结构程序 顺序结构 分支结构 循环(重复)结构,第一节 顺序结构程序设计,顺序结构程序完全按指令书写的前后顺序执行每一条指令,是最基本、最常见的程序结构特点 顺序性、结构简单,只适应于简单问题的处理,例1 计算,例2 移位,第二节:循环结构,第一章 基础知识,循环与分支

3、程序设计,第一章 基础知识,循环与分支程序设计,循环程序设计,根据条件重复执行一段指令就构成了循环程序结构。,MOV AX,0;累加求和寄存器清0 MOV BX,OFFSET ARRAY;数组始址送BX中 MOV CX,50;循环控制计数初始化 AGAIN:ADD AX,BX ADD BX,2;数组地址增2,BX指向下一个元素 DEC CX;循环控制计数减1 JNZ AGAIN;计数不为0时继续循环 MOV S,AX;计数为0时循环结束,和存于S中,保证循环正常执行和结束的条件:正确地初始化循环控制计数和初始条件 正确地检测循环条件 必须保证能达到循环结束条件(例如在循环体内有修改循环控制值的

4、指令),指令系统提供了专门用于循环结构的循环控制指令,更加简便的地实现循环结构。,循环控制指令,循环控制指令的转移范围为:-128+127字节,LOOP AGAIN,(段内短转移),(CX)0 且 ZF=1?,(CX)0 且 ZF=0?,在前面的求和例子中,可用一条循环指令代替两条指令:,MOV CX,80 MOV SI,-1 MOV AL,$AGAIN:INC SI CMP AL,STRSSI LOOPNE AGAIN MOV LEN,SI,循环程序设计方法,控制循环的方法可分为两类:,计数循环用于循环次数已知的情况,条件循环用于循环次数不确定的情况,设:STRS DB string$,例:

5、将字变量num中的数按16位二进制数位分离开,逐位转换为ASCII码,并从最高有效位开始依次逐位存入以binbuf为起始地址的16个字节单元中。,设:(num)=4230H,要求将 4230H=0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 B 逐位分离开 并转换为:30 31 30 30 30 30 31 30 30 30 31 31 30 30 30 30,先将(num)-(DX),再讨论如何分离开各二进制位并转换为ASCII码,分析如下:,根据上述分析,将(DX)中的二进制数依次循环左移1位,可以使得各个数位的分离(AND)和ASCII码转换(ADD)操作完全相同,便于组

6、织循环,并且循环次数已知(16次)。,例:将十进制数(number)转换为八进制数,方法:(number)/8 保留余数,除法操作循环次数事先未知,仅当商为0时,循环结束。此例为条件循环,此例为计数循环,next,(DX)=0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0,1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0(ROL DX,1),0 0 0 0 0 0 0 1(AND?,1),0 0 0 0 0 0 0 0,+0 0 1 1 0 0 0 0(ADD?,30H),0 0 1 1 0 0 0 0,30,0 0 0 0 1 0 0 0 1 1 0 0 0 0

7、0 1(ROL DX,1),0 0 0 0 0 0 0 1(AND),0 0 0 0 0 0 0 1,+0 0 1 1 0 0 0 0(ADD),0 0 1 1 0 0 0 1,31,0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0(ROL DX,1),0 0 0 0 0 0 0 1(AND),0 0 0 0 0 0 0 0,+0 0 1 1 0 0 0 0(ADD),0 0 1 1 0 0 0 0,30 31 30 30 30 30 31 30 30 30 31 31 30 30 30,1.,2.,16.,binbuf,返回,30,例 统计AX中的二进制数含“1”的总个数,程序

8、段如下:MOVCX,0 AGAIN:ANDAX,AX;(AX)=0?JZQUIT;是,退出循环 SALAX,1;否,(AX)的最高位移入CF位 JNCNEXT;CF1时,转向NEXT再次循环 INCCX;CF=1,计数器(CX)(CX)+1 NEXT:JMPAGAIN;再次循环 QUIT:,上述程序为当型循环程序结构:先判断条件,后执行循环。,课堂练习:采用循环结构完成自然数1到100的求和运算。,next,当型循环与直到型循环:,存储模型与简化段定义伪指令,较新版本的汇编程序(MASM5.0与MASM6.0)除支持完整段定义伪指令外,还提供了一种新的简单易用的存储模型和简化的段定义伪指令。,

9、1 存储模型伪指令存储模型的作用是什么呢?存储模型决定一个程序的规模,也确定进行子程序调用、指令转移和数据访问的缺省属性(NEAR或FAR)。当使用简化段定义的源程序格式时,在段定义语句之前必须有存储模型.MODEL语句,说明在存储器中应如何安放各个段。MODEL伪指令的常用格式如下:MODEL 存储模型,在DOS下用汇编语言编程时,可根据程序的不同特点选择前6种模型,一般可以选用SMALL模型。另外,TINY模型将产生COM程序,其他模型产生EXE程序。FLAT模型只能运行在32位x86 CPU上,DOS下不允许使用这种模型。当与高级语言混合编程时,两者的存储模型应当一致,2 简化的段伪指令

10、,简化的段定义语句书写简短,语句.CODE、.DATA和.STACK分别表示代码数据段和堆栈段的开始,一个段的开始自动结束前面一个段。采用简化段指令之前必须有存储模型语句.MODEL。,3与简化段定义有关的预定义符号,汇编程序给出了与简化段定义有关的一组预定义符号,它们可在程序中出现,并由汇编程序识别使用。有关的预定义符号如下:(1)code 由.CODE 伪指令定义的段名或段组名。(2)data 由.DATA 伪指令定义的段名,或由.DATA、.DATA?、.CONST和.STACK所定义的段组名。(3)stack 堆栈段的段名或段组名。,在完整的段定义情况下,在程序的一开始,需要用段名装入

11、数据段寄存器,例mov ax,data_seg1mov ds,ax若用简化段定义,则数据段只用.data来定义,而并未给出段名,此时可用mov ax,data mov ds,ax这里预定义符号data就给出了数据段的段名。,返回,参考答案2:.model small.code mov ax,data mov ds,ax xor ax,ax mov cx,100 again:add ax,cx loop again mov ax,4c00h int 21h end,参考答案1:.model small.data num dw 1.code mov ax,data mov ds,ax mov ax

12、,0 mov cx,100 again:add ax,num inc num loop again mov ax,4c00h int 21h end,(下述例子可用5.X 或6.X 版汇编程序汇编),思考题:显示下面数组中的数据:ARRAY DB 1,3,7,8,5,4,6,8,第一章 基础知识,循环与分支程序设计,循环程序设计方法,例 试编制一个程序把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。,code_seg segmentmain proc far assume cs:code_segstart:mov bx,8222h mov ch,4;四位循环一次,共进行4次循环即可

13、以rotate:mov cl,4;循环高4位到低4位 rol bx,cl;对BX进行循环操作 mov al,bl;,思路:四位二进制对应一位十六进制。循环4次每次循环4位高位先显示:rol判断结果和10比较。,第一章 基础知识,循环与分支程序设计,and al,0fh;取出要转换的4位二进制数,存入al寄存器中 cmp al,10;判断是否为十进制数制的字符 jae changetoa_f;如果大于10,跳转到changetoa_f进行十六进制的转换 add al,30h;0-9的十六进制转换 jmp disp changetoa_f:add al,37h;a-f的十六进制转换 disp:mo

14、v dl,al;在屏幕上显示结果 mov ah,02 int 21h dec ch;利用dec 和jnz来实现循环操作,代替loop的功能 jnz rotate,第一章 基础知识,循环与分支程序设计,mov ax,4c00h int 21hmain endpcode_seg endsend start;程序结束,例 在ADDR单元中存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中。,算法:要测出Y中1的个数就应逐位测试,一个比较简单的办法是可根据最高有效位是否为1来记数,然后用移位的方法把各位数逐次移到最高位去。循环的结束可以用计数值为16来控制,但更好的办法是结合上述方法可以

15、用测试数是否为0来作为结束条件,这样可以在很多情况下缩短程序的执行时间。此外考虑到Y本身为0的可能性,应该采用WHILEDO的结构形式。,第一章 基础知识,循环与分支程序设计,程序框图,第一章 基础知识,循环与分支程序设计,程序:,第一章 基础知识,循环与分支程序设计,int 21hmain endpcode_seg endsend start,例 在附加段中有一个首地址为LIST和未经排序的字数组,在数组的第一个字中存放着该数组的长度,数组的首地址已存放在DI寄存器中。AX寄存器中存放着一个数。要求编制一程序:在数组中查找该数,如果找到此数则把它从数组中删除。,算法:这一程序应该首先查找数组

16、中是否有(AX),如果没有则不对数组作任何处理就结束程序。如果找到这一元素则应把数组中位于其前(指地址比该元素高)的元素后移一个字(即向低地址方向移动),并修改数组长度值。如果找到的元素正好位于数组末尾,则不必移动任何元素,只要修改数组长度值就可以。这里第一部分的查找元素可以使用串处理指令,第二部分的删除元素则可使用循环结构,由于查找结束时就可以知道该元素的位置,因此可以作为循环次数已知的情况来设计。,第一章 基础知识,循环与分支程序设计,流程图:,第一章 基础知识,循环与分支程序设计,程序:,data_seg segment LIST dw 10,0,11,22,33,44,55,66,77

17、,88,99data_seg endscode_seg segment assume cs:code_seg,es:data_segmain proc farstart:mov ax,data_seg;代码段地址空间分配 mov es,ax cld;设置DF=0,地址自动递增操作 mov ax,33;设置AX寄存器的数值 lea di,LIST,第一章 基础知识,循环与分支程序设计,push di;将LIST的首地址压栈,为将来改变数组元素个数,就可以弹出该;地址 mov cx,es:di;数组个数放入CX中 add di,2 repnz scasw;将AX与ES:DI中的元素进行比较,若相等

18、则跳转到DELETE;结束否则 je delete pop di jmp short exitdelete:jcxz del_last;判断要删除的元素是否为最后的数组元素,是就跳转到;DEL_LAST执行del_next:,第一章 基础知识,循环与分支程序设计,mov bx,es:di;数组元素向前移动 mov es:di-2,bx add di,2 loop del_nextdel_last:pop di dec word ptr es:di;改变数组元素的大小exit:mov ax,4c00h int 21hmain endpcode_seg ends end start,第一章 基础知

19、识,循环与分支程序设计,例 试编制一程序;从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是则退出程序;如是则开始接收留入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存人),直到接收到第二个空格符时退出程序。,算法:这一程序要求接收的字符从空格符开始又以空格符结束,因此程序中必须区分所接收的字符是否是第一个字符,为此设立作为标志的存储单元FLAG,一开始将其置为0,接收第一个字符后可将其置1。,第一章 基础知识,循环与分支程序设计,data_seg segment buffer db 100 dup(?)flag db?data_seg endscode_seg seg

20、ment assume cs:code_seg,ds:data_segmain proc farstart:mov ax,data_seg mov ds,ax lea bx,buffer mov flag,0;FLAG初始化为0,准备接收第一个字符next:mov ah,01,第一章 基础知识,循环与分支程序设计,int 21h;从键盘输入一个字符,存放在AL寄存器中 test flag,01h;判断是否为第一个字符 jnz follow;不是第一个字符跳转到FOLLOW cmp al,20h;是第一个字符,判断该字符是否为空格 jnz exit mov flag,1 jmp nextfoll

21、ow:cmp al,20h;判断是否为空格 jz exit;是空格就退出 mov bx,al;不是就将该字符的ASC码存入缓冲区内 inc bx jmp next,第一章 基础知识,循环与分支程序设计,exit:mov ax,4c00h int 21hmain endpcode_seg endsend start,第一章 基础知识,循环与分支程序设计,(3)多重循环,第一章 基础知识,循环与分支程序设计,例 有一个首地址为A的N字数组,请编制程序使该数组中的数按照从大到小的次序排序。,算法:我们采用起泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对则不做任何操作;如次序不对则使这两个

22、数交换位置。下表表示了这种算法的例子,可以看出在做了第一遍的(N一1)次比较后,最小的数已经放到了最后,所以第二遍比较只需要考虑(N-1)个数,即只需要比较(N一2)次,第三遍则只需要做(N一3)次比较总共最多(N1)遍比较就可以完成排序。,第一章 基础知识,循环与分支程序设计,loop1:mov dx,cx mov bx,0loop2:mov ax,abx cmp ax,abx+2 jge continue xchg ax,abx+2 mov abx,axcontinue:add bx,2 loop loop2 mov cx,dx loop loop1 mov cx,num,第一章 基础知识

23、,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第二节 分支结构程序设计,第一章 基础知识,循环与分支程序设计,(2)分支程序设计方法,例 在附加段中,有一个按从小到大顺序排列的无符号数的数组,其首地址存放在Dl寄存器中,数组中的第一个单元存放着数组长度。在AX中有一个无符号数,要求在数组中查找(AX),如找到则使CF0,并在SI中给出该元素在数组中的偏移地址,如末找到则使CF1。,算法:我们已经遇到过多个表格查找的例子,都是使用顺序查找的方法,本例是一个已经排序的数组,可以采用折半查找法以提高查找效率。折半查找法先取有序数组的中间元素与查找值进行比较,如相等则查找成功,如查找值大

24、于中间元素,则再取高半部的中间元意与查找值相比较;如查找值小于中间元素,则再取低半部的中间元素与查找值相比较,如此重复直到查找成功或最终未找到该效(查找不成功)为止。折半查找法的效率高于顺序查找法。,第一章 基础知识,循环与分支程序设计,流程图:,第一章 基础知识,循环与分支程序设计,程序:,;本模块功能是用寄存器AX的内容对字数组(从小到大顺序排列)进行折半查找;其中查找的数组首地址位于寄存器DI内;数组的第一个元素为数组的长度,其余的为数组的具体内容,dseg segment start_addr dw?;保存数组首地址用的变量dseg endscseg segment assume cs

25、:cseg,ds:dsegb_search proc near push ds push ax mov ax,dseg mov ds,ax,第一章 基础知识,循环与分支程序设计,;第一步;首先判断AX寄存器的数是否在该数组的范围内.;即要判断是否小于数组元素的最小数或大于数组元素的最大数,cmp ax,es:di+2;和最小数据进行比较 ja chk_last;若大于最小数,跳转到CHK_LAST,同时 CF 为 0 lea si,es:di+2;先把最小元素的地址存入SI寄存器中 je exit_b;在判断是否和最小元素相等,如果相等结束 stc;否则小于最小元素,设置CF为1 jmp ex

26、it_b;程序结束chk_last:mov si,ES:di;si存放数组元素个数 shl si,1;也就是2。其结果就是数组占用的字节数量 add si,di;SI为数组下标最大的元素的地址,第一章 基础知识,循环与分支程序设计,cmp ax,es:si;和最大数进行比较,同时CF为1 jb search;若小于最大数,就进入折半查找 je exit_b;/否则等于最大值则退出结束,表明AX的数据与最大数组数据相同.stc;置CF为1 jmp exit_b;第一步结束,;第二步;折半查找功能search:mov start_addr,di;保存寄存器DI的字数组的首地址 mov si,di;

27、读取数组长度,第一章 基础知识,循环与分支程序设计,even_idx:test si,1;判断是否为奇数.注意数组长度的地址指定数组中间的元素(因为数组是字数组)jz add_idx inc si;奇数就要加1,以便能取到完整的数据add_idx:add di,si;数组首地址加上中间数组的偏移量,得到中间数组的有效地址compare:cmp ax,es:di;和寄存器数据进行比较 je all_done;相等,就结束操作,同时CF为0 ja highter;大就查找高段数组 cmp si,2 jne idx_ok,第一章 基础知识,循环与分支程序设计,no_match:stc je all_

28、done;寄存器si和2进行比较的结果,程序退出的标志idx_ok:shr si,1 test si,1 jz sub_idx inc sisub_idx:sub di,si jmp short compare,第一章 基础知识,循环与分支程序设计,higher:cmp si,2;je no_match shr si,1;数据元素除以2,减半 jmp short even_idxall_done mov si,di mov di,start_addrexit_b:retb_search endpcseg ends end b_search,第一章 基础知识,循环与分支程序设计,(3)跳跃表法,

29、第一章 基础知识,循环与分支程序设计,例:根据bx的数据进行跳转,从低位到高位分别判断bx寄存器的位数是否为1,为1跳转,否则继续判断,直到bx寄存器为0。,程序:,b_a segment b_t dw r1 dw r2 dw r3 dw r4 dw r5 dw r6 dw r7 dw r8b_a ends,code segment assume cs:code,ds:b_a main proc farstart:push ds xor ax,ax push ax mov ax,b_a mov ds,ax,第一章 基础知识,循环与分支程序设计,lea si,b_t;将表地址存入si寄存器l:c

30、mp bx,0;判断bx是否为零 jz exit shr bx,1;将bx寄存器的最低位传入CF中 jnb not_yet;若CF为0,跳转不执行任何操作 jmp word ptrsinot_yet:add si,type b_t jmp l r1:mov dx,0 jmp short exitr2:mov dx,1,jmp short exitr3:mov dx,2 jmp short exitr4:mov dx,3 jmp short exitr5:mov dx,4 jmp short exitr6:mov dx,5 jmp short exitr7:mov dx,6 jmp short

31、exitr8:mov dx,7exit:retmain endpcode endsend start,第一章 基础知识,循环与分支程序设计,第三节 子程序结构,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,上述程序也可以采用如下方式:,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,(1)子程序使用过程中注意的问题,CALL使返回地址入栈,所以RET时应该使返回地址出栈,如果子程序中不能正确使用堆栈而造成执行RET前SP并未指向进入子程序时的返回地址,则必然会导致运行出错,因此于程序中对堆栈的使用应

32、该特别小心,以免发生错误。,CALL指令和RET指令就完成了调用和返回的功能。为了保证其正确性,除PROC的属性要正确选取外,还应该注意子程序运行期间的堆栈状态。,第一章 基础知识,循环与分支程序设计,调用程序(又称主程序)和子程序经常是分别编制的,所以它们所使用的寄存器往往会发生冲突。,如果主程序在调用子程序以前的某个寄存器内容在从子程序返回后还有用而子程序又恰好使用了同一个寄存器,造成破坏了该寄存器的原有内容,那就会造成程序运行错误,这是不能允许的。,第一章 基础知识,循环与分支程序设计,为避免这种错误的产生在一进入子程序后就应该把子程序所需要使用的寄存器内容保存在堆栈中,而在退出子程序前

33、把寄存器的内容恢复原状。,第一章 基础知识,循环与分支程序设计,(2)主程序与子程序参数传递,含义:将dl中的字符在屏幕上显示出来,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,binihex proc near mov ch,4 rotate:mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah jl print add al,7h print:mov dl,al mov ah,2 int 21h dec ch jnz rotate retbinihex

34、endp,crif proc near mov dl,0dh;换行 mov ah,2 int 21h mov dl,0ah;mov ah,2 int 21h retcrif endpdecihex endsend main,远程调用,codeb segment assume cs:codebbtodecdisp proc far push ax push bx push cx push dx mov cx,0;mov bx,1234h;rotate1:mov ax,bx cwd mov bx,10 div bx add dl,30h push dx inc cx mov bx,ax;mov a

35、x,bx test ax,0ffffh,jnz rotate1repeat1:pop dx mov ah,2 int 21h loop repeat1 pop dx pop cx pop bx pop ax retbtodecdisp endpbtohexdisp proc far push ax push bx push cx push dxmov ch,4 mov cl,4,rotate2:rol bx,cl mov al,bl and al,0fh cmp al,10 jc decimal2 add al,37h jmp dispp2decimal2:add al,30hdispp2:m

36、ov dl,al mov ah,2 int 21h dec ch jnz rotate2 pop dx pop cx pop bx pop ax retbtohexdisp endp,btoo proc far push ax push bx push cx push dx mov cl,1 mov ax,bxloopto:mov bx,ax rol bx,cl cmp cl,1 jz too and bx,0007h jmp toootoo:and bx,0001htooo:xchg bl,dl add dl,30h xchg ax,bx mov ah,2 int 21h,xchg ax,b

37、x shl ax,cl jz exit3 mov cl,3 jmp looptoexit3:pop dx pop cx pop bx pop ax ret btoo endp codeb ends,code segment assume cs:codemain proc far mov bx,5678H call btodecdisp call btohexdisp call btoo mov ah,4ch int 21hmain endpcode endsend main,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章

38、 基础知识,循环与分支程序设计,例 从键盘输入十进制数据,以十六进制显示在屏幕上,文件asm_0.asm,public xyzpublic crlfdata segment publicxyz dw 9data endsdecihex segment publicassume cs:decihexcrlf proc nearmov dl,0dhmov ah,2,int 21hmov dl,0ahmov ah,2int 21hretcrlf endpdecihex endsend,第一章 基础知识,循环与分支程序设计,文件2:asm_1.asm,extrn crlf:nearextrn xyz:

39、worddecihex segment publicassume cs:decihexstart:mov ax,seg xyz mov ds,ax mov ax,xyz call decibin call crlf call binihex call crlf mov ax,4c00h int 21h,decibin proc near mov bx,0 newchar:mov ah,1 int 21h sub al,30h jl exit cmp al,9d jg exit cbw xchg ax,bx mov cx,10d mul cx xchg ax,bx add bx,ax jmp n

40、ewchar exit:retdecibin endp,binihex proc near mov ch,4 rotate:mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah jl print add al,7h print:mov dl,al mov ah,2 int 21h dec ch jnz rotate retbinihex endp,decihex endsend start,第一章 基础知识,循环与分支程序设计,运行:masm asm_0.asm 形成asm_0.obj masm asm_1.asm 形成as

41、m_1.obj link asm_0.obj asm_1.obj 形成asm_0.exe执行文件 link asm_1.obj asm_0.obj 形成asm_1.exe执行文件,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,code_seg segment org 100 table dw 3 dup(?)ary1 dw 10,20,30,40,50 count1 dw 5 sum1 dw?ary2 dw 10,20,30,40,50 count2 dw 5 sum2 dw?assume cs:code_seg,ds:cod

42、e_seg,ss:code_segmain proc farstart:mov ax,code_seg mov ds,ax mov ss,ax mov table,offset ary1 mov table+2,offset count1 mov table+4,offset sum1,call near ptr proadd mov si,table+4 mov bx,si call disp mov table,offset ary2 mov table+2,offset count2 mov table+4,offset sum2 call proadd mov si,table+4 m

43、ov bx,si call disp mov ax,4c00h int 21hmain endp,第一章 基础知识,循环与分支程序设计,;以十进制显示BX寄存器中的数据disp proc near push ax push dx push cx mov cx,0disp_next:mov ax,bx cwd mov bx,10 div bx add dl,30h push dx inc cl mov bx,ax cmp ax,0000h jz exit,jmp disp_nextexit:mov ah,02hprint:pop dx int 21h dec cl jnz print pop c

44、x pop dx pop ax retdisp endp;显示模块结束proadd proc near push si push di push cx,push ax mov si,table mov di,table+2 mov cx,di mov di,table+4 xor ax,axnext:add ax,si add si,2 loop next mov di,axpop ax pop cx pop di pop si retproadd endpcode_seg ends end start,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知

45、识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,堆栈段最满时的状态:,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,可以由一连串常数表达式组成,每个字段用一个表达式,相互之间用逗号隔开,如果使用STRUC定义中的值则可不写任何值(缺省)。预赋值说明也可以使用DUP操作符。,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识

46、,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,第一章 基础知识,循环与分支程序设计,程序:,data_seg segment n_v dw 6 result dw?data_seg endsstack_seg segment;定义堆栈段 dw 128 dup(?)tos label word;确定栈顶指针stack_seg endscode1_seg segment assume cs:code1_seg,ss:stack_seg,ds:data_segmain proc farstart:mov ax,

47、data_seg mov ds,ax mov ax,stack_seg mov ss,ax mov sp,offset top mov bx,offset result push bx,第一章 基础知识,循环与分支程序设计,mov bx,n_v push n_v call far ptr fact mov bx,result call near ptr disp mov ax,4c00h int 21h retmain endp;以十进制显示BX寄存器中的数据disp proc near push ax push dx push cx mov cx,0disp_next:mov ax,bx c

48、wd,mov bx,10 div bx add dl,30h push dx inc cl mov bx,ax cmp ax,0000h jz exit jmp disp_nextexit:mov ah,02hprint:pop dx int 21h dec cl jnz print pop cx pop dx,第一章 基础知识,循环与分支程序设计,pop ax retdisp endp;显示模块结束code1_seg endscode_seg segmentframe struc save_bp dw?save_cs_ip dw 2 dup(?)n dw?result_addr dw?fra

49、me ends assume cs:code_segfact proc far push bp mov bp,sp push bx push ax mov bx,bp.result_addr,mov ax,bp.n push bx dec ax je done push ax call far ptr fact mov bx,bp.result_addr mov ax,bx mul bp.n jmp short returndone:mov ax,1return:mov bx,ax pop ax pop bx pop bp ret 4fact endp,code_seg ends end st

50、art,用汇编语言可以编写两种格式的源程序:格式一:经汇编、连接后产生.EXE可执行文件格式二:经汇编、连接、转换成.COM可执行文件。,(1)EXE文件 EXE程序装入内存时的映像如图4.25所示。,程序段前缀PSP的结构:(256字节)表4-4(p116),next,EXE文件与COM文件,(2)COM文件 COM程序装入内存时的映像如图4.25所示。,(1)代码段、数据段及堆栈段在同一段,64KB。,(4)所有的子过程应定义为NEAR类型,(5)直接用INT 20H退出程序返回DOS,(2)第一条指令的偏移地址固定为100H,即有(IP)=100H。,(3)SP指向该物理段末尾,故不用定

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号