




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四节汇编语言程序设计及举例概述顺序结构分支程序循环程序字符串处理程序码转换程序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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年建筑测量自考试题及答案
- 化学实验基础知识综合应用试题
- 2025年高考物理热光原部分专项复习试题
- 现场安全考试试题及答案
- 2025年湘西中考美术题库及答案
- 数字经济的面试题及答案
- 工会专干考试题目及答案
- 髙空作业考试题及答案
- 高民族民俗考试题及答案
- 2025年语言教育考试试题及答案
- SMP-05-004-00 受托方化验室监督管理规程
- CJT 399-2012 聚氨酯泡沫合成轨枕
- 中小微企业FTTR-B全光组网解决方案
- 第七单元单元任务“视频拍摄脚本写作”统编版高中语文必修上册
- 提高感染性休克集束化治疗完成率工作方案
- 山东省汽车维修工时定额(T-SDAMTIA 0001-2023)
- 《采一束鲜花》教学设计
- 初级中药师考试试题
- 福建省永霖锂电材料有限公司 废旧锂电池梯次利用及回收处理项目 环境影响报告
- 高考英语1600个必考高频词汇
- 单桩承载力详细计算书
评论
0/150
提交评论