北京邮电大学微机原理期末考试汇编必备x段程序_第1页
北京邮电大学微机原理期末考试汇编必备x段程序_第2页
北京邮电大学微机原理期末考试汇编必备x段程序_第3页
北京邮电大学微机原理期末考试汇编必备x段程序_第4页
北京邮电大学微机原理期末考试汇编必备x段程序_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、1数据传送:问题描述:设在DS3000H,偏移地址为0100H的内存中顺序存放着100个字节的数据。要求传送到以2000H为起始偏移地址的区域。代码:利用寄存器间接寻址来寻找操作数可以编程如下:mov ax,3000hmov ds,ax ;建立数据段mov si, 0100h ;建立源数据指针mov di,2000h ;建立目的地指针mov cx,100 ;设置计数器nt:mov al,si ;取数mov di,al ;送数inc si ;调整指针inc didec cx ;计数器减1jne nt ;CX10转 nt 标号另一种方法:提示:若将倒数第2、3行用 REP MOVSB代替,则可进一

2、步简化。 MOV AX,3000H MOV DS,AX MOV ES,AX MOV SI,0100H MOV DI,0200H MOV CX,100 CLDNT:MOVSB LOOP NT INT 20H2多字节的加法:问题描述:有两个4字节的无符号数相加,这两个数分别放在2000H和3000H开始的存储单元中,低位在前,高位在后。运算后,得到的和放在2000H开始的内存单元中。代码:MOV SI,2000H ;取第一个数的首地址MOV AX,SI ;将第一个数的低16位取到AXMOV DI,3000H ;取第二个数的首地址ADD AX,DI ;两个数的低16位 相加。MOV SI,AX ;低

3、16位相加的结果送到2000H和2001H单元MOV AX,SI+2 ;取第一个数的高16位送到AX中ADC AX,DI+2 ;两个数的高16位连同CF相加MOV SI+2,AX ;高16位相加的结果送到2002H,2003H单元。3多字节组合BCD码十进制加法问题描述:设第一个数据在1000H开始的8个内存单元中,第二个数据在2000H开始的8个内存单元中,要求相加之后将结果放在2000H开始的内存区域。代码:mov si,1000h ;SI指向第一个数据mov di,2000h ;DI指向第二个数据mov cx,8 ;共有8字节长c1c ;清除进位标志l1: mov a1,si ;取第一个

4、数据的1个字节 adc a1,di ;加上第二个数据的相应字节 daa ;对相加结果进行十进制调整mov di,a1 ;存到指定的内存区域 inc si ;指向下一个字节 inc di ;指向下一个字节 dec cx ;计数器减1 jnz l1 ;如未算完,则继续 int 20h ;返回DOS4多字节的移位问题描述:使BX所指的四个单元中的四字节数左移1位,代码:SAL WORD PTR BX0,lRCL WORD PTR BX2,15ASCII码转换为BCD码问题描述:设键盘输入的100个十进制数的ASCII码已在首地址DS为3000H,偏移量为0100H的内存区域中,要求把它们转换为组合型

5、BCD码,高地址的放在高半字节。存入偏移地址为0200H的区域中。分析:算法是这样的:先将较低字节的32H转换为02H,再将较高字节的34H转变为40H,然后将其与02H按位相或成为42H。循环50次完成50个字节的组合BCD码的转换。代码: MOV AX,3000H MOV DS,AX MOV SI,0100H MOV DI,0200H MOV CX,0032HNEXT:MOV AL,SI INC SI AND AL,0FH MOV BL,AL MOV AL,SI INC SI PUSH CXMOV CL,4SHL AL,CLPOP CXADD AL,BL MOV DI,ALINC DILO

6、OP NEXTINT 20H6比较两个字符串问题描述:假设两个字符串分别放在DS段(设ESDS)的str1和str2区域,其长度分别为L1和L2,比较这两个字符串是否相等。若相等,则置M1单元内容为FFH,否则为00H。代码:提示: 前缀REPZ和REPE表示,当作比较的两字节(或字)相等时继续往下比较直至出现不等,或者CX减为0为止。 重复前缀使用前必须对CX置重复次数。每比较一次,CX1CX (字比较CX1CX)。CX0表示两个字符串所有字节都比较过了,这时结束比较。 前缀REPNE和REPNZ则表示字节(字)不等时继续往下比较。 LEA SI,STR1 LEA DI,STR2 MOV C

7、X,L1 CMP CX,L2 JNE UNEQ CLD REPZ CMPSB JNE UNEQ MOV AL,0FFH JMP EXIT1UNEQ:MOV AL,00HEXIT1:MOV M1,AL INT 20H7有条件的数据传送问题描述:将从BLOCK1单元开始的100个字节传送到BLOCK2单元开始的区域中,两区域的相对位置不确定。数据传送过程中遇0DH(回车符)则结束传送。假设DSES,即BLOCK1和BLOCK2同在一个数据段,并且位置不定(BLOCK1值可以大于、小于或等于BLOCK2)。分析:由于该题要求有条件传送,使用MOVSB指令不如LODSB和STOSB方便。又因源数据区和

8、目标数据区有可能重叠,所以应区分两种情况分别用地址增量和地址减量的方式来传送。若源地址大于目的地地址,则应用地址增量方式从首地址开始传送,反之,则应用地址减量方式从末地址开始传送。代码:LEA SI,BLOCK1 LEA DI,BLOCK2 MOV CX,100 CMP SI,DI JE DONE JA DFO STD ADD SI,99 ADD DI,99JMP TRAN DFO:CLDTRAN:LODSB CMP AL,0DH JE DONE STOSB LOOP TRANDONE:INT 20H8确定字符串的长度问题描述:在STRING为始地址的字符串中搜索字符串结束符“”,并将字符串的

9、长度(不包括“”)放入STRLN单元中;如果连续100个字节单元之中无“”符则在STRLN单元中填入0FFH。提示:目标串搜索指令 SCASB 和 SCASW将AL(或AX)与ES:DI所寻址的字节(或字)内容进行比较而不改变其值;只影响标志位SF、ZF、PF、OF、CF、AF,并且修改DI指针使指向目标串中下一个元素。代码:LEA DI,STRINGMOV AL,MOV CX,100CLDREPNE SCANSBJZ DONE1MOV AL,0FFHJMP DONE2DONE1: MOV BX,100 SUB BX,CX DEC BL MOV AL,BLDONE2: MOV STRLN,AL

10、 INT 20H另一方法:LEA DI,STRING MOV AL, MOV CX,100 DEC DIL1: INC DI CMP AL,DI LOOPNE L1 JZ DONE1MOV AL,0FFH JMP DONE2DONE1: MOV BX,100 SUB BX,CX DEC BL MOV AL,BLDONE2: MOV STRLN,AL INT 20H9求符号数的最大值问题描述:设数据区1000H开始的区域中存放着50个字节的符号数。要求找出其中最大的一个数并存到0FFFH单元。代码:MOV BX,1000H MOV AL, BX MOV CX,31HL1: INC BX CMP

11、AL, BX JGE L2 MOV AL, BX L2: DEC CXJNE L1MOV BX,0FFFHMOV BX ,ALINT 20H注:如果是无符号数则把JGE L2换为JAE L2。10两个32位无符号数乘法问题描述:32位乘法需要做4次16位乘法,每次都要将部分积相加来实现,相加时则要注意位数对齐。我们用连续的四个字单元来存放乘积,各部分积应加到适当单元。分析:data segment num1 dw 8000h,8000h num2 dw 8008h,8000h mut dw 4 dup (0)data endsstack segment stack stack db 100 d

12、up (s)stack endscode segment para codeassume cs: code, ds: data, ss: stack proc far push ds xor ax,ax push axmov ax,datamov ds,axlea bx,num1mov ax,bx ; baxmov si,bx+4 ; dsimov di,bx+6 ; cdimul si ; b*dmov bx+8,ax ;部分积1存于积单元中。 mov bx+10,dx mov ax,bx+2 ; aax mul si ; a*d add bx+10,ax adc bx+12,dx ; 带进

13、位加入积2单元中 mov ax,bx ; bax mul di ; b*c add bx+10,ax ; b*c 加入积单元 adc bx+12,dx ; 带进位加至部分积3 adc word ptr bx+14,0 ; 进位加至部分积4 mov ax,bx+2 ; aax mul di ; a*c add bx+12,ax adc bx+14,dx retsta endpcode end end sta11data segment x dw 12 y dw ?data endsstack segment stack stack db 100 dup (s)stack endscode seg

14、ment para code assume cs:code, ds:data, ss:stacksign proc far push ds xor ax, ax push ax mov ax, data mov ds, ax mov ax, x and ax, ax ; 建立标志 jz zero jns plus mov bx, 0ffffh jmp donezero: mov bx, 0 jmp doneplus: mov bx, 1done: mov y, bx ret sign endpcode ends end sign12大散转问题描述:根据BUFFER单元的值,转到相应的子程序。子

15、程序的入口地址存放在转移表BRTAB中。若BUFFER内容等于n,则转到第n个子程序(n从1256,0代表256)。代码:data segment buffer db 3brtab dw 0000h, 3000h dw 0100h, 3050h dw 0000h, 3090h dw 0100h, 4050h dw 0000h, 6000hdata endsstack segment stack stack db 100 dup (s)stack endscode segment para code assume cs:code, ds:data, ss:stackbrch proc far p

16、ush ds xor ax, ax push ax mov ax, data mov ds, ax lea bx, brtab mov al, buffer dec al moav ah, 0 shl ax, 1 ; AL*2 shl ax, 1 ; AL*4 add bx, ax jmp dword ptr bx retbrch endpcode ends end brch13数组求和问题描述:假设有一数组求和子程序SUM,试用这个子程序分别求出ARY1和ARY2两个数组的和,结果分别存入SUM1和SUM2字单元中。代码:data segment aryl db 03h, 07h, 50h,

17、 06h, 23h, 45h, 0f6h, 0dfh len1 equ $ary1 sum1 dw ? ary2 db 33h, 44h, 55h, 12h, 78h, 89h, 0feh, 0cdh len2 equ $ary2 sum2 dw ? data endsstack segment stack stack db 100 dup (s)stack endscode segment para code assume cs:codc,ds:data,ss:stacksta proc far push ds xor ax,ax push ax mov ax,data mov ds,ax

18、mov ax,len1 push axlea ax,ary1 push ax call sum mov ax,len2 push ax lea ax,ary2 push ax call sum retsta endpsum proc push bp mov bp,sp push ax push bx push cx pushf mov cx,bp6 ; get array lenth mov bx,bp4 ; get offset address xor ax,ax ; sum=0add1: add al,bx adc ah,0 inc bx loop add1 mov bx,ax popf

19、pop cx pop bx pop ax pop bp ret 4sum endpcode ends end sta14阶乘问题描述:确定变量NUMB的阶乘,把结果存入变量FNUMB。变量NUMB的值大于0且小于8。代码:data segment num db 3 nj dw ?data endsstack segment stack stack db 200 dup(s)stack endscode segment para code assume cs:code,ds:data,ss:stacksta proc far push ds xor ax,ax push ax mov ax,data mov ds,ax push cx mov ah,0 mov a1,num call factor x1: mov nj,ax pop cx retsta endpfactor proc push ax sub ax,1 jne fcon pop ax jmp retunfcon: call factor x2: pop cx mul clRetun: retfactor endpcode ends end sta1416进制数转换为ASCII码CHANGE MACRO LOCAL P1 CMP AL,10 ;如AL0BH 0AH

温馨提示

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

评论

0/150

提交评论