微机原理例题_第1页
微机原理例题_第2页
微机原理例题_第3页
微机原理例题_第4页
微机原理例题_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

例:有数组x(x1,x2,……,x10)和y(y1,y2,……,y10),

编程计算

z(z1,z2,……,z10)z1=x1+y1z2=x2+y2z3=x3-y3z4=x4-y4z5=x5-y5z6=x6+y6z7=x7-y7z8=x8-y8z9=x9+y9z10=x10+y10

逻辑尺:00110111001减法0加法

合肥学院

计算机科学与技术系

《汇编语言程序设计》1xdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_ruledw00dch;0000,0000,1101,1100

……

movbx,0movcx,10movdx,logic_rulenext:movax,x[bx]shrdx,1jcsubtractaddax,y[bx]jmpshortresult;向前引用subtract:subax,y[bx]result:movz[bx],axaddbx,2loopnext……

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》2;查表法,实现一位16进制数转换为ASCII码显示datasegmentASCIIdb30h,31h,32h,33h,34h,35h db36h,37h,38h,39h ;0~9的ASCII码

db41h,42h,43h,44h,45h,46h;A~F的ASCII码

hex db0bh;任意设定一个待转换的一位16进制数dataendscodesegmentmainprocfarassumecs:code,ds:datastart: pushds xorax,ax pushax movax,data movds,ax ;-------------

movbx,offsetASCII ;BX指向ASCII码表

moval,hex ;AL取得一位16进制数,正是ASCII码表中位移 andal,0fh ;只有低4位是有效的,高4位清0

xlat

;换码:AL←DS:[BX+AL] movdl,al ;入口参数:DL←AL movah,2 ;02号DOS功能调用

int21h ;显示一个ASCII码字符

retmainendpcodeends

endstart3例:将正数n

插入一个已整序的正数字数组。该数组的首地址和末地址分别为ARRAY_HEAD,ARRAY_END。分析:题目要求在已经排好序的正数数组中插入一个正数n,因此,解决问题的关键是找到要出入正数n的位置。需要考虑如下问题?(1)如何找到插入位置及软件实现?(2)如何插入正数n及软件实现?(3)数组边界问题考虑?

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》4●由于数组已经排好序,因此可以将正数n依次和数组中的数进行比较,比较有个方向问题,这里假设数组在存储单元中按地址递增的方向从小到大依次存放。不妨从大数开始进行比较,当遇到第一个比n小的数,记下该位置,该位置就是要插入n的位置。●找到出入位置后,如何在不破坏原来数据顺序基础上插入n呢?打个比方:9个同学按高矮依次做在1~10号椅子上,现在第10个同学按照高矮要做在第5号椅子上,那么如何空出第5号椅子呢,但仍然保持高矮次序?只要9号同学移到10号,

910,

89,78,67,56就可以了。同样,我们可以如法炮制,数组中将要插入数n位置前的数依次前移一个位置(两个字节),空出要插入位置,将n放入即可。●在插入数时,可能遇到特殊情况,即数n比数组中所有的数都要大,或者小。若比所有的数都大,就不需要移动原数组中的数,直接插入即可;若比所有的数都小,就将数n放在数组的首位置。

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》5

很显然,查找位置和空出位置的过程就是循环比较的过程,因此采用循环结构来实现,那么,循环条件如何确定呢?其中一种比较容易想到循环条件就是:数组长度(或数组首地址)及K<=n,其中K为依次从数组中取出的一个数。另外,可以充分利用题目中的已知条件即数组中的数均为正数,所以我们可以在数组的开始的前一个位置存放一个负数,不妨存放数-1,这样,在循环控制时就不需要用数组长度来进行控制,可以进一步简化程序的设计。而且需要注意的是,有可能一次都不需要移动数组中的数。因此,应选择DO—WHILE结构形式。

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》6

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》7xdw?array_headdw3,5,15,23,37,49,52,65,78,99array_enddw105ndw32……

movax,nmovarray_head-2,0ffffhmovsi,0compare:cmparray_end[si],axjleinsertmovbx,array_end[si]movarray_end[si+2],bxsubsi,2jmpshortcompareinsert:movarray_end[si+2],ax……35152337495265789910532-1array_headarray_endn

x

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》8例:把BX中的二进制数以十六进制的形式显示在屏幕上

如:1011001011111010BB2FAH

BX1234

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》9分析:(1)程序结构的确定由题意应该把BX的内容从左到右每4位为一组在屏幕上显示出来,显然这可以用循环结构来完成,每次显示一个十六进制数位,因而循环次数是已知的,计数值为4。

(2)循环体的构成(算法确定)循环体应该包括:二进制到所显示字符的ASCII之间的转换,以及每个字符的显示。需要了解相关知识:◆字符和其ASCII码之间的关系?

“0”~“9”

30H~39H,“A”~”F”41H~5AH◆如何显示一个字符?(a)将显示字符的ASCII码放入DL寄存器;(b)将AH的内容置为2(功能号);(c)执行INT21H(DOS功能调用)。

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》10(3)循环控制条件分析●因为循环次数已知,可以使用LOOP指令实现,但是必须注意:由于循环移位指令中使用CL寄存器作为移位次数寄存器,而LOOP指令的循环次数隐含在CX寄存器中,因此,必须注意这两者之间的冲突。●除了可以使用LOOP指令之外,还可以使用条件跳转指令来实现。LOOPAGAIN

DEC计数器

JNZAGAIN11

……

movch,4;初始化rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30h;’0’~’9’ASCII30H~39Hcmpal,3ahjlprintitaddal,7h;’A’~’F’ASCII41H~46Hprintit:movdl,almovah,2int21h

decchjnzrotate

……方法1(条件跳转指令)

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》12

……

movcx,4;初始化rotate:pushcx

movcl,4rolbx,clmoval,blandal,0fhaddal,30h;’0’~’9’ASCII30H~39Hcmpal,3ahjlprintitaddal,7h;’A’~’F’ASCII41H~46Hprintit:movdl,almovah,2int21h

popcx

looprotate

……方法2(LOOP)

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》13(2)条件控制datasegmentarraydw12,11,22,33,44,55,66dw77,88,99,111,222,333numberdw55low_idxdw?high_idxdw?dataends例:折半查找算法.在数据段中,有一个按从小到大顺序排列的无符号数字数组ARRAY,数组中的第一个单元存放着数组的长度。在AX中有一个无符号数,要求在数组中查找number,如果找到,则使CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF=1。

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》14121122334455667788991112223330123456789101112(ax)=55low_idx

1145

high_idx

12555(si)=0ahCf=0(ax)=90low_idx17789

high_idx

1212888(si)=10hCf=1折半算法

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》15在一个长度为n的有序数组r中,查找元素k的折半查找算法可描述如下:(1)初始化被查找数组的首尾下标,low1,highn;(2)若low>high,则查找失败,置CF=1,退出程序。否则,计算中点mid[(low+high)/2];(3)k与中点元素r[mid]比较。若k=r[mid],则查找成功,程序结束;若k<r[mid],则转(4);若k>r[mid],则转(5);(4)低半部分查找,highmid-1,返回(2),继续查找;(5)高半部分查找,lowmid+1,返回(2),继续查找。

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》16……

leadi,arraymovax,number;?

cmpax,[di+2];?

jachk_lastleasi,[di+2]jeexit;?

stcjmpexit;?chk_last:

movsi,[di];?

shlsi,1;?

addsi,di

cmpax,[si];?

jbsearchjeexit;?

stcjmpexit

;?算法

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》17compare:cmpax,[bx+si]jeexitjahigher

deccxmovhigh_idx,cxjmpmidhigher:

inccxmovlow_idx,cxjmpmidno_match:stcexit:……search:movlow_idx,1movbx,[di];个数

movhigh_idx,bxmovbx,dimid:movcx,low_idxmovdx,high_idxcmpcx,dxjano_match

addcx,dxshrcx,1movsi,cxshlsi,1

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》18(1)PUBLIC伪指令格式:PUBLIC符号[,符号]

功能:说明其后的符号是全局符号。全局符号能被其他模块引用。(局部符号)(2)EXTRN伪指令格式:EXTRN符号:类型[,符号:类型]

功能:说明在本模块中需要引用的、由其他模块定义的符号,即外部符号。5多个模块之间的参数传送问题

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》19sourcemodule1

extrna:word

Data1segmentbdw?Data1endscode1segmentassumecs:code1,ds:data1Mainprocfarstart:movax,data1movds,ax

…movah,4chint21hMainendpCode1endsEndstartsourcemodule2

publica

Data2segmentadw?Data2endscode2segmentassumecs:code2,ds:data2Mainprocfarstart:movax,data2movds,ax

…movah,4chint21hMainendpCode2endsEndstart注意:应先有public定义,然后才有extrn说明

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》20NAME MOD1

EXTRN DISP:FAR

PUBLIC STR1,N,BUFDATA1 SEGMENT STR1 DB ‘HOWDOYOUDO?’ N = $-STR1BUF DB ‘THISISANEXAMPLEOFMODULESPROGRAM$′DATA ENDSSTACK SEGMENTSTACK DB200DUP(0)STACK ENDSCODE1 SEGMENT ASSUMECS:CODE1,DS:DATA1,SS:STACKSTART:

MOV AX,DATA MOV DS,AX

CALL DISP MOV AH,4CH INT 21HCODE1 ENDSEND START例:用模块化程序设计方法建立两个模块MOD1ASM和MOD2ASM的数据通讯。

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》21NAME MOD2EXTRN STR1:BYTE,STR2:BYTE,N:ABSPUBCIC DISPDATA2 SEGMENTSTR2 DB81DUP(0)DATA2 ENDSCODE2 SEGMENT ASSUMECS:CODE2,ES:DATA2DISP PROC FAR MOV AX,DATA2 MOV ES,AXLEA BX,STR1 MOV CX,N LEA SI,STR2NEXT:

MOV AL,[BX] MOV ES:[SI],AL INC BX INC SI LOOP NEXT LEA DX,BUF MOV AH,9 INT 21H RETDISP ENDPCODE2 ENDS END

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》226.3子程序举例例1:HEXIDEX是一个十六进制数转换成十进制数的程序。要求把从键盘输入的0—FFFFH的十六进制正数转换为十进制数并在屏幕上显示出来。Displayequ2hKeyequ1hDoscallequ21hHexidecsegmentMainprocfarassumecs:hexidecStart:pushdssubax,axpushaxcallhexideccallcrlfcallbinideccallcrlfjmpmainretmainendpCrlfprocnearmovdl,0ahmovah,displayintboscallmovdl,0dhmovah,displayintdoscallretcrlfendpHexidecendsendstart

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》23Hexidecprocnearmovbx,0Newchar:movkey_inintdoscallsubal,30hjlexitcmpal,10djladd_to

subal,27hcmpal,0ahjlexitcmpah,10hjgeexitAdd_to:movcl,4shlbx,clmovah,0addbx,axjmpExit:RetHexidecendpBinidecprocnearmovcx,10000dcalldec_divmovcx,1000dcalldec_divmovcx,100dcalldec_divmovcx,10dcalldec_divmovcx,1dcalldec_divretDec_divprocnearmovax,bxmovdx,0divcxmovbx,dxmovdl,aladddl,30hmovah,displayintdoscall

retdec_divendpBinidecendp

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》24例2:一个简单的信息检索系统。在数据区里,有10个不同的信息,编号为0—9,每个信息包括30个字符。现在要编制一个程序:从键盘接收0—9之间的一个编号,然后在屏幕上显示相应编号的信息的内容。Datareasegmentthirtydb30msg0db‘0IlikemyIBM-PC--------------’msg1db‘1IlikemyIBM-PC--------------’msg2db‘2IlikemyIBM-PC--------------’msg3db‘3IlikemyIBM-PC--------------’msg4db‘4IlikemyIBM-PC--------------’msg5db‘5IlikemyIBM-PC--------------’msg6db‘6IlikemyIBM-PC--------------’msg7db‘7IlikemyIBM-PC--------------’msg8db‘8IlikemyIBM-PC--------------’msg9db‘9IlikemyIBM-PC--------------’errmsgdb‘error!!!Invalidpraameter’Datareaends

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》25Stacksegmentdb256dup(0)toslablewordStackendsPrognamsegmentassumecs:prognam,ds:datarea,ss:stackStart:pushdsxorax,axpushaxmovax,stackmovss,axmovax,datareamovds,axmovsp,offsettosBegin:movah,1int21hsubal,’0’jcerrorcmpal,‘9’jaerrorMovbx,offsetmsg0MulthirtyAddbx,axCalldisplayJmpbeginError:movbx,offseterrmsgcalldisplayretDisplayprocnearmovcx,30movdl,[bx]calldispcharincbxloopdisp1movdl,0dhcalldispcharmovdl,0ahcalldispcharretDispcharendpDispcharprocnaermovah,2int21hretDispcharendpMainendpPrognamendsEndstart

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》26例3:人名排序程序。先从终端键入最多30个人名,当所有人名都进入后,按字母上升的次序将人名排序,并在屏幕上显示已经排好的人名。

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》27Datasegmentnameparlabelbytemaxnlendb21namelendb?nameflddb21dup(?)crlfdb13,10,’$’endaddrdw?messg1db‘name?’,’$”messg2db‘sortednames’,13,10,’$’namectrdb0nametabdb30dup(20dup(‘’))namesavdb20dup(?),13,10,’$’sdb0DataendsCodesegmentmainprocfarassumecs:code,ds:data,es:datastart:pushdsmovax,0pushaxmovax,datamovds,axmoves,axcldleadi,nametaba20loop:callb10readcmpnamelen,0jza30cmpnamectr,30jea30calld10storjmpa20loopa30:cmpnamectr,1jbea40callg10sortcallk10dispa40:movah,4chInt21hMainendp

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》28

b10readprocnearmovah,09leadx,messg1int21hmovah,0ahleadx,nameparint21hmovah,09hleadxcrlfInt21hmovbx,0movbl,namelenmovcx,21subcx,bxb20:movnamefld[bx],20hincbxloopb20ret

b10readendp

d10storprocnearincnamectrcldleasi,namectrmovcx,10repmovswret

p10storendp

g10sortprocnearsubdi,40movendaddr,dig20:movsleasi,nametabg30:movcx,20movdi,siadddi,20addax,dimovax,dimovbx,sirepecmpsb

jbeg40callh10xchgg40:movsi,axcmpsjnzg20retG10sortendp

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》29

h10xchgprocnearmovcx,10leadi,namesavmovsi,bxrepmovswmovcx,10movdi,bxrepmovswmovcx,10leasi,namesavrepmovswmovsreth10xchgendp

k10dispprocnearmovah,09leadx,messg2int21hleasi,nametableadi,namesavmovcx,10repmovswmovah,09leadx,namesavint21hdecnamectrjnzk20retK10dispendpendstart

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》30◆段定义伪操作:完整的段定义格式举例datasegment;定义数据段

…dataends;----------------------------------------extrasegment;定义附加段

…extraends;----------------------------------------codesegment;定义代码段

assume

cs:code,ds:data,es:extrastart:movax,datamovds,ax;段地址段寄存器

…codeendsendstart

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》仅指定某个段分配给哪个段寄存器,并不把段地址装入段寄存器中31……codesegmentmainprocfarassume……start:pushdsmovax,0pushax……retmainendpcodeendsendstart……codesegmentmainprocfarassume……start:…………movax,4chint21hmainendpcodeendsendstart

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》32

例:一个完整的段定义格式STACK SEGMENTSTACK;定义堆栈段STACK ...;分配堆栈段的大小STACKENDSDATA SEGMENT;定义数据段

...;定义数据DATA ENDSCODE SEGMENT‘CODE’;定义代码段

ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA;程序开始

MOVDS,AX ...;程序代码

MOVAX,4C00H;程序终止,返回DOS INT21HCODE ENDS

;代码段结束

... ;子程序代码

ENDSTART ;汇编结束

例:一个完整的段定义格式

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》33

2.存储模型与简化段定义伪指令

前面介绍了完整的段定义格式,用完整段定义格式虽然可以控制段的各种属性,但程序员很少使用。现在的汇编程序提供了一种简化的段定义方式,它使定义段更简单、方便。具体形式如下:

.MODELSMALL ;定义存储模式

.STACK ;定义堆栈段

.DATA ;定义数据段

... ;定义数据

.CODE ;定义代码段

.STARTUP ;程序起始点,并建立DS和SS内容

... ;程序代码

.EXIT0 ;程序结束点,返回DOS ... ;子程序

END ;汇编结束

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》34简化的段定义伪操作.code[name].data.data?.fardata[name]默认名:FAR_DATA.fardata?[name]默认名:FAR_BSS.const.stack[size]默认为1KB

合肥学院

计算机科学与技术系

何立新《汇编语言程序设计》35

汇编语言提供7

温馨提示

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

最新文档

评论

0/150

提交评论