《微机原理及接口技术》全套电子教案第四章 汇编语言程序设计的课件_第1页
《微机原理及接口技术》全套电子教案第四章 汇编语言程序设计的课件_第2页
《微机原理及接口技术》全套电子教案第四章 汇编语言程序设计的课件_第3页
《微机原理及接口技术》全套电子教案第四章 汇编语言程序设计的课件_第4页
《微机原理及接口技术》全套电子教案第四章 汇编语言程序设计的课件_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

第四节汇编语言程序设计及举例概述顺序结构分支程序循环程序字符串处理程序码转换程序DOS系统功能调用1一、概述1.编写步骤(1)分析问题,抽象出数学模型(2)确定算法(3)画程序流程图工作框判断调子程序

(4)分配内存工作单元和寄存器。

(5)按程序流程图编制程序。(6)上机调试,排错。起始框终止框22.程序质量判断(1)执行时间(2)占用内存空间(3)语句行数3.程序结构顺序分支循环子程序3二、顺序结构例4-1:P.139,两个32位无符号数乘法,乘积为64位。4设地址指针被乘数低16位B→AX乘数低16位D→SI存入缓冲区乘数高16位C→DIB*D=部分积1被乘数高16位A→AXA*D=部分积2部分积2低16位加部分积1高16位存入缓冲区B*C=部分积3进位加至部分积2高16位与前面对应16位相加保存进位部分积4与前面的和相加保存在缓冲区A*C=部分积4恢复进位返回5说明:(1)数据段:data segmentmulnumdw0000,0ffffh,0000,0ffffh,4dup(?)data ends被乘数乘数乘积(2)堆栈段:stacksegmentparastack‘stack’db100dup(?)stackends6(3)码段:codesegment assumecs:code,ds:data,ss:stack,es:data … ……codeendsAssume语句指明了码段、数据段、堆栈段和附加段是哪些段7

1)定义了一个远过程将段和IP压入堆栈子程序返回start procfar pushds movax,0 pushax…

retstart endp

连接程序为每个用户程序建立了一个程序段前缀,开始处(0单元)安排了一条返回DOS的指令,而且程序段前缀的段地址赋给了DS。82)接着三条指令movax,datamovds,axmoves,ax设置DS,ES。3)bx为地址指针[bx]~[bx+3]:32位被乘数[bx+4]~[bx+7]:32位乘数[bx+8]~[bx+0fh]:放乘积94)16位乘法mul

AX:被乘数si或di:乘数dx.ax:32位乘积 leabx,mulnummulu32:movax,[bx]movsi,[bx+4]movdi,[bx+6]

mulsimov[bx+8],axmov[bx+0ah],dxbx:数据指针B*DB→axD→siC→di保存部分积110movax,[bx+2]

mulsiaddax,[bx+0ah]adcdx,0mov[bx+0ah],axmov[bx+0ch],dxmovax,[bx]

muldiaddax,[bx+0ah]adcdx,[bx+0ch]A→axA*DB*CB→ax部分积2低位加部分积1的高位保存与部分积3加11mov[bx+0ah],axmov[bx+0ch],dxpushfmovax,[bx+2]

muldi addax,[bx+0ch]adcdx,0 popfadc dx,0mov[bx+0ch],axmov[bx+0eh],dx20A*CA→ax保存后一次进位位与部分积4加保存12例:有符号数相乘(1)符号处理

(2)绝对值相乘13说明:(1)调用无符号数乘法子程序前的被乘数,乘数,乘积的符号处理。bx为地址指针置乘积符号位初值B→axA→dxD→siC→dimovsign,0leabx,mulnummovax,[bx]movdx,[bx+2]movsi,[bx+4]movdi,[bx+6]14cmpdx,0

jnsothernotaxnotdxaddax,1adcdx,0

notsignmov[bx],axmov[bx+2],dx检验被乘数符号改变乘积符号位为负取补暂存被乘数为正转other15other:cmpdi,0

jnsgomulnotsinotdiaddsi,1adcdi,0

notsigngomul:callmulu32检验乘数符号改变乘积符号位为负取补调用无符号乘法程序为正转gomul16(2)

调用子程序后,根据乘积的符号对乘积作处理。检验乘积符号为负取补为正转done cmpsign,0 jedone not wordptr[bx+8] not wordptr[bx+0ah] not wordptr[bx+0ch] not wordptr[bx+0eh] addwordptr[bx+8],1 adcwordptr[bx+0ah],0 adcwordptr[bx+0ch],0 adcwordptr[bx+0eh],0done: retstartendp17三、分支程序例:SIGEF:MOVAX,BUFFERORAX,AXJEZEROJNSPLUSMOVBX,0FFFFHJMPCONTIZERO:MOVBX,0JMPCONTIPLUS:MOVBX,1CONTI:…为负建立条件为0转ZERO为正转PLUS18四、循环程序组成:(1)初始化(2)循环体(3)修改参数(4)循环控制结构形式:191.用计数器控制循环

(1)减1计数器(2)加1计数器20例4-2:P.141在一串给定个数的数中寻找最大值,放至指定的存储单元,每个数为16位。源程序名COUNT=2×nn个数据字放结果(最大值)(1)数据段NAMESEARCH_MAXDATASEGMENTBUFFERDWX1,X2,…XNCOUNTEQU$-BUFFERMAXDW?DATAENDS21

STACKSEGMENTSTACK‘STACK’DB64DUP(?)TOPEQU$-STACKSTACKENDSTOP为栈顶偏移64个字节(2)堆栈段22CODESEGMENTSTARTPROCFARASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,TOP MOVSP,AX(4)置子程序返回地址定义子程序(3)代码段置DS,置SS,置SP23

MOVCX,COUNT LEABX,BUFFERMOVAX,[BX]INCBXINCBXSHRCXDECCX

AGAIN:CMPAX,[BX]

JGENEXTMOVAX,[BX]NEXT:INCBXINCBX

LOOPAGAIN

MOV[BX],AXRETSTARTENDPCODEENDSENDSTART

21

取第一个字(5)循环初始化,CX=2n指针指向下一个字(6)

循环体,比较个数减1÷2,CX=个数AX大,转NEXT最大值→AX(7)修改参数,指针加1(8)循环控制,CX-1→CX,为0结束存最大值BX为数据指针242.用开关变量控制循环一个循环体中有两个循环支路,设一个开关变量,控制进入哪个循环支路。例:数据采集系统。采到的前5个数用一种函数(FUN1)处理,开关=0。采到的后7个数用另一种函数(FUN2)处理,开关=1。25说明:(1)数据:datasegmentbufferdw5,5,5,5,5,5,5,5,5,5,5,5blockdw12dup(?)count1equ5count2equ7dataends12个数据个数存结果26(2)初始化:

源数据指针buffer→bx处理后数据指针block→sicount1+1,count2+1→cx开关0→dx(3)循环主体:

判开关量dx=0?dx=0callfun15个数据处理完后dx=1,cx=count2+1dx=1callfun2

每处理完一个数,修改指针bx,si27

mov dx,0 mov cx,count1+1 lea bx,buffer lea si,blockagain:mov ax,[bx] cmp dx,0 jne anoth call fun1 loop next mov dx,1 mov cx,count2+1 jmp againnext: mov [si],ax inc bx inc bx inc si inc si jmp againanoth:call fun2 loop next ret(1)循环初始化开关dx=0cx为计数器bx源指针si目的指针(2)循环主体开关量转为1为0,函数1处理处理后保存(3)修改参数函数2处理(4)循环控制开关不为0转anoth283.多重循环

一个循环中包含另一个循环,称多重循环。如:二维数组处理,二重循环。注意:

(1)各重循环的初始控制条件及实现。

(2)内循环可嵌套在外循环中,也可几个内循环并列在外循环中,可从内循环跳到外循环,不可从外循环中直接跳进内循环。

(3)要防止出现死循环。

29例:延时程序,多重循环实现软件延时。DELAY:MOVDX,3FFH

TIME:MOVAX,0FFFFH

TIME1:DECAXNOPJNETIME1DECDX

JNETIMERET内循环控制变量AX,初值=FFFFH

外循环控制变量DX,初值=3FFH30五、字符串处理程序

字符:ASCII码说明:(1)ASCII码数字、字母形成一个有序序列:0~9:30H~39HA~Z:41H~5AHa~z:61H~7AH(2)一些I/O装置(键盘,显示器,打印机)采用ASCII码传送。(3)常用的控制字符:0AH换行(LF)0DH回车(CR)311.确定字符串长度字符串长度不定,以某个特定字符为结束符。例4-3:从头搜索字符串的结束符,统计长度。(1)数据段 name length_of_string datasegmentstring db ‘abcduvwxyz’,0dhll db ?cr equ 0dhdataends字符串stringcr:结束符串长度放ll单元32

(2)寄存器安排字符串地址指针:DI字符串长度:DL

串结束字符:AL33(3)程序

leadi,stringmovdl,0moval,cr again:scasb

jedoneincdljmpagaindone:leabx,llmov[bx],dl22串地址偏移→DI串长度DL=0结束符→AL找到搜索串未找到,长度加1继续搜索存长度342.加偶校验到ASCII字符ASCII码:7位二进制数,最高位可作为校验位。偶校验:

数据位1的个数为偶数,最高位置“0”,否则置“1”。35例4-4:有一个ASCII字符串放在STRING开始的单元,从串中取出每一个字符,检查“1”的个数,为偶数,则最高位置“0”;为奇数,最高位置“1”。36说明:

leasi,string movcx,countagain: lodsb

andal,al jpenext oral,80h mov[si-1],alnext: deccx jnzagain串指针:si串长度:cx取数,si+1→si自行与,影响PF奇,最高位置1送回偶37六、码转换程序十六进制、二进制、BCD码、ASCII码转换方法:(1)算术和逻辑运算指令,软件实现;(2)查表指令;(3)硬件译码。381.十六进制→ASCII例4-5:P.14639说明:

(1)十六进制:0~9A~FASCII码:30H~39H41H~46H

对0~9,加上30H对A~F,加上‘A’-10(2)地址指针:源(十六进制)bx目的(ASCII)si(3)cx=L1=2,每次循环转换一个字节两位十六进制数:低位与高位拆开:1)AND AL,0FH2)MOV CL,4SHR AL,CL低四位原高四位→低四位40

数据段data segmentl1 dw 2string db 14h,9Ahl2 dw ?buffer db 2*2dup(?)data ends串长度l1放串长度l2十六进制数放ASCII41again:moval,[bx]movdl,alandal,0fh

callchangemoval,dlpushcxmovcl,4shral,clpopcx

callchangeincbx

loopagain取十六进制数低四位→ASCII高四位→ASCII42一位十六进制数ASCII码子程序:

change:proccmpal,10jladd_0

addal,’A’-’0’-10add_0:addal,’0’mov[si],alincsiretchangeendp0~9转add_0A~F0~9432.ASCII→压缩BCD说明:(1)对非压缩BCD码,只要将ASCII的高4位屏蔽(AND)即可。(2)对压缩BCD码,要处理两个ASCII码,先为低位BCD码,后为高位BCD码,组合起来。

44datasegmentl2dw4bufferdb34h,33h,38h,39hl1dw?stringdb2dup(?)dataendsstacksegmentstack’stack’db100dup(?)stackendsASCII存BCD码45

codesegment

assumecs:code,ds:data,es:data,ss:stackstartprocfarbegin:pushdsmovax,0pushaxmovax,datamovds,axmoves,ax46

movcx,l2shrcx,1movl1,cxleabx,bufferleasi,stringagain:moval,[bx]

andal,0fhmovdl,alincbxmoval,[bx]

andal,0fhBCD码区长度取ASCII码化为BCD码取下一个ASCII码化为BCD码47

pushcxmovcl,4shlal,clpopcx

oral,dlmov[si],alincbxincsiloopagainretstartendpcodeendsendbegin左移四位组合两位BCD码保存修改指针483.二进制到ASCII串例4-6:P.179,把在内存变量NUMBER中的16位二进制数,每一位转换为相应的ASCII码,存入串变量STRING中。分析:

(1)数据

bufferdw4f78h;16位二进制数

stringdw16dup(?);存ASCII码

49(2)代码段 start proc far begin: push ds mov ax,0 push ax mov ax,data mov ds,ax mov es,ax lea di,string mov cx,lengthstring push di push cx 串指针di串长度50 mov al,30h

rep stosb pop cx pop di mov al,31h mov bx,numagain:rcl bx,1 jnc next mov [di],al next: inc di loop again ret start endp code ends23建立串为全’0’1的ASCII码取数左移一位,相应位进CF为0为1,1的ASCII码送串514.BCD→二进制压缩BCD码4位→二进制方法:

(1)(((千位×10)+百位)×10+十位)×10+个位(2)千位控制加1000的次数,百位控制加100的次数,十位控制加10的次数,再加上个位。注意:所有运算都用二进制52例:采用第一种方法。(((千位×10)+百位)×10+十位)×10+个位说明:(1)数据dnumdw9999h;BCD码bnumdw?;二进制数53(2)分离mov ax,dnummov di,ax mov dx,ax mov bx,axand bx,000fhanddx,00f0hmovcl,4shrdx,clanddi,0f00hmovcl,8shrdi,clandax,0f000hmovcl,12shrax,cl十位→dX百位→di千位→ax个位→bx54(3)乘以10,x×10=x×2+x×8addax,axmovcx,axaddax,axaddax,axaddax,cxaddax,di……x×8→AXx×2→CX千位乘10加上百位55也可采用循环结构进行。方法:十进制数Y=anXn+┄+a1X1+a0X=10=(┅(anX+an-1)X+┅+a1)X+a0初值Y=an,i=n-1Y=Y×X+aii=i-1结束条件:i<0

565.二进制→BCD十六位二进制数转换成BCD码。方法1:找出二进制数中所包含的10000,

1000,100,10的个数,即BCD码。方法2:二进制数BB=bm×

2m+┄+b1×

21+b0=(┅(bm×

2+bn-1)×2+┅+b1)×2+a0初值B=0,i=m-1B=B×2+bi

i=i-1结束条件:i<0

乘法和加法用十进制运算,结果为BCD码。

57

例:采用方法1,16位二进制→5位非压缩BCD码(2)movax,bnumleabx,a_strgmovdl,0;计数清0说明:(1)数据段

bnumdw270fh;16位二进制数a_strgdb5dup(?);5个单元存BCD码again1:subax,2710hjsnext1incdljmpagain1next1:….万位包含10000的个数<10000处理1000,100,10减1000058

若程序中采用除法指令,即:movdx,0movax,bnummovcx,10000divcxxchgax,dx被除数二进制数商(BCD码)在dx,余数在ax除数10000二进制数59例:采用方法2,

16位二进制→4位压缩BCD码(≤9999)说明:

输入:DX放16位二进制数输出:CF=0,AX=4位压缩BCD码

CF=1,转换数>9999,DX不变btobcdprocfarcmpdx,9999jbetranstcjmpexittran:<9999>9999,置CF=1,退出60

tran:movax,0movcx,16again:clcrcldx,1adcax,axdaaloopagainclcexit:retbtobcdendp2416位结果(BCD)清0循环左移bi→CFB×2+bi十进制调整ax中为BCD61七、列

列:由数据单元(一个或多个字节)组成,称为元素,在存储器中顺序存放。(1)顺序是连续的。(2)顺序是链接的,每个元素由数据和指向下一元素的指针构成。列操作:查找(搜索,查询)、增加、删除、分类、排序62(一)无序列

1.加一个项至一个无序列

例1:缓冲区有一无序列,列长度放缓冲区第一字节,加一项。说明:(1)数据元素:

bufferdb10,’abcdefghij’db?;列最后keydb‘$’;要加项(2)循环结构,数据指针:DI长度:CX关键字:AL

63

leadi,buffermovch,0movcl,[di]incdimoval,key

repnzscasbjedone

mov[di],alincbufferdone:ret指向列第一个元素长度送cx搜索关键字不相等,项入列末搜索停止长度加1642.从一个无序列中删去一个元素例2:缓冲区有一无序列,列长度放缓冲区第一个字节,另有一单元放删去元素。说明:(1)数据元素:

bufferdb10,’abcdefghij’

keydb‘f’;要删项(2)循环结构

数据指针:DI长度:CX关键字:AL65

leadi,buffermovch,0movcl,[di]incdimoval,key

repnescasbjnedonedecbuffermovsi,didecsixchgsi,di

repmovsbdone:ret指向列第一个元素长度送cx搜索关键字找到,列长度减1未找到结束要删元素地址为目的→di下一元素地址为源→si要删元素后的元素依次上移663.找无序列中的最大值和最小值例3:缓冲区有一无序列,列长度放缓冲区第一个字节,找最小值放MINVAL单元,最大值放MAXVAL单元。说明:(1)有符号数比较用JG大于转移,JL小于转移(2)数据bufferdb10,22,-12,80,-6,-70,-9,127,-10,0,40minvaldb?maxvaldb?

67(3)leabx,buffermovch,0movcl,[bx]incbxmoval,[bx]

movminval,almovmaxval,alincbxdeccx指向第一个元素长度送cx地址指针bx送al,minvalmaxvalbx指向第二个元素调整循环次数68again:moval,[bx]cmpal,minvaljenextjga1

movminval,aljmpnexta1:cmpal,maxvaljlnext

movmaxval,alnext:incbxdeccxjneagainret把小的值送minval与最小值比较把大的值送maxval与最大值比较相等大小69(二)排序无序列查找,比较慢,因要一项项顺序进行。有序列,升序,降序,可提高效率。气泡分类法(BubbleSort)两两比较法70第一次:en,en-1比较,en>en-1,不交换,否则交换en-1,en-2比较,en-1>en-2,不交换,否则交换en-2,en-3比较,en-1>en-2,不交换,否则交换22-1280-6-70-9127-10040e1e2en-1en127-10……

-9-10

e2,e1比较,e2>e1,不交换,否则交换,e1最小值-6-70-7080-70-12第二次:en,en-1比较,en>en-1,不交换,否则交换

…...e3,e2比较,e3>e2,不交换,否则交换,e2第二小…...第n-1次:en,en-1比较,en>en-1,不交换,否则交换-7022(2)小循环J初值为n,循环一次,减1,N减至小于I时结束小循环。(1)大循环I初值为2循环一次加1,即:第一次,从en至e2第二次,从en至e3…...第n-1次,en算法说明71(3)设一个交换标志,初值为N(即小循环J的初值)在一次大循环中,若未发生交换,交换标志不变,发生交换,将此时小循环J赋给标志。每次大循环结束时检查交换标志=N,则结束排序。因为交换标志=N表示:①一次也没有发生交换②本次大循环交换发生在en与en-1间72程序说明:(1)数组中的10个数据,每个为2个字节。bufferdw22,-12,80,-6,-70,-9,127,-10,0,40countequ$-buffer(2)寄存器分配

dx:大循环变量I,初值=2cx:小循环变量J,初值=Nbx:交换标志=Jsi:地址指针73

movdx,2;大循环变量Iconti:movcx,countdeccxdeccx;小循环变量Jmovbx,cx;交换标志movsi,cxagain:movax,buffer[si]cmpax,buffer[si-2]jgenext

xchgax,buffer[si-2];交换mov[si],axmovbx,cx;置交换标志next:decsidecsideccxdeccxcmpcx,dx;J<Ijgeagain;No,转againcmpbx,count-2;J<I,交换标志=N?jedone;是转done结束incdx;否,I=I+1,继续jmpcontidone:ret74(三)有序列操作1.搜索

从头到尾752.对分搜索(1)先取中间值eN/2与关键字比,相等找到,不等比两数大小。(2)若X>eN/2,则下一次取区间eN/2~eN与X比较,取e3N/4(3)若X<eN/2,则下一次取区间e1~eN/2与X比较,取eN/4(4)每次比较区间缩小一半,直至搜索到,或区间压为076例:0,11,15,21,34,57,60,78,90,127,N=10,区间0~9搜索次数K121234区间上限L050022区间下限R101010553序号J575232数eJ577857152115比较X>eJX=eJX<eJX>eJX<eJX≠eJ

77(1)数组10个,每个为2个字节。stringdw-80,-50,-20,0,30,40,100,2000,10000,25000countequ$-bufferptrndw?chardw2020ocunt:20(2)寄存器分配

si:区间上限Ldi:区间下限Rbx:序号ax:关键字202078

movdx,1;dx作为搜索次数conti:movbx,si;bx表示Jaddbx,di;上限+下限shrbx,1;J=(上限+下限)/2cmpax,[bx];关键字与eJ比较jefound;相等,找到转foundpushfcmpbx,si;J是否与区间上限相等jenofod;相等,找不到关键字,转popfjleless;X<eJ,转lessmovsi,bx;以J作为下一次的区间上限jmpnextless:movdi,bx;以J作为下一次的区间下限

温馨提示

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

评论

0/150

提交评论