欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第4章基本汇编语言程序设计.pdf

    • 资源ID:76271066       资源大小:238.13KB        全文页数:29页
    • 资源格式: PDF        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第4章基本汇编语言程序设计.pdf

    第 4 章 基本汇编语言程序设计习题 4.1 例题 4.2 如果要求算术右移8 位,如何修改程序。解答思路:首先由最高位字节向次低位字节传送 次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送 00h 到最高位字节;如为1,送 ffh 到最高位字节。传送可参考例题4.2,不过应从第一号字节送第零号字节,最高位字节向次低位字节传送;也可以用循环来完成:.model small .stack 256 .data qvar dq 1234567887654321h .code .startup mov cx,7 mov si,1 again:mov al,byte ptr qvarsi mov byte ptr qvarsi-1,al inc si loop again test al,80h jz ezz mov bl,0ffh jmp done ezz:mov bl,0 done:mov byte ptr qvar7,bl .exit 0 end 习题 4.2 例题 4.2 如果要求算术左移7 位,如何用移位指令实现。解答思路:可设计外循环体为8 个字节左移一次,方法是:最低位字节算术左移一次,次低位字节至最高位字节依次带CF 位循环左移一次(内循环共8 次),外循环体控制执行7 次即可。.model small .stack 256 .data qvar dq 1234567887654321h .code .startup mov dx,7 ;外循环次数mov ax,byte ptr qvar0 ;最低位字节送ax lpp:shl ax,1 ;最低位字节左移一次,其d7 移入 CF 位mov si,1 mov cx,7 ;内循环次数again:rcl byte ptr qvarsi,1 ;高位字节依次左移P50 inc si loop again dec dx jnz lpp .exit 0 .end 习题 4.3 将 AX 寄存器中的16 位数连续 4 位分成一组,共4 组,然后把这4 组数分别放在 AL、BL、CL 和 DL 寄存器中。解答思路:设这四组从低位到高位分别放在AL、BL、CL 和 DL 寄存器中。仅列出代码段:mov bl,al ;将 al 中的两组分开and al,0fh ;屏蔽高四位后送al mov cl,4 ;原 al 中的数据逻辑右移4 次送 bl shr bl,cl mov dl,ah ;将 ah 中的两组分开and dl,0f0h ;屏蔽低高四位后送dl mov cl,4 ;原 ah 中的数据逻辑右移4 次送 dl shr dl,cl mov cl,ah ;屏蔽高四位后送cl and cl,0fh 习题 4.4 编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。解答getkey:mov ah,1 ;从键盘输入,出口:al 存键值int 21h cmp al,a ;判键值是小写字母?jb getkay cmp al,z ja getkay sub al,20h ;是小写字母转换为大写字母mov dl,al mov ah,02h ;显示int 21h 习题 4.5 已知用于LED 数码管显示的代码表为:LEDtable DB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hDB 80h,90h,88h,83h,0c6h,0c1h,86h,8eh 它依次表示0 9、A F 这 16 个数码的显示代码。现编写一个程序实现将lednum 中的一个数字(0 9、A F)转换成对应的LED 显示代码。解答 .model small .stack 256 .data LEDtable DB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h DB 80h,90h,88h,83h,0c6h,0clh、86h,8eh lednum DB?.code .startup mov bx,offset LEDtable mov al,lednum xlat ;al 中存有对应的LED 显示代码 .exit 0 end 习题 4.6 请问第2 章例题 2.39/2.41/2.43/2.46的分支是单分支、双分支或多分支结构?解答例题 2.43/2.45 2.47 为单分支结构;2.50 为多分支结构。习题 4.7 分析第2 章例题 2.40 的分支结构,画出流程图。解答习题 4.8 如果在例题4.4 的 table 中依次填入msg1 msg8,程序应该怎样修改?解答(1)将 jmp tablebx 指令改为:mov dx,tablebx(2)去掉源程序中:.exit 0-end之间的语句习题 4.9 编制一个程序,把变量bufX 和 bufY 中较大者存入bufZ;若两者相等,则把其中之一存入bufZ 中。假设变量存放的是8 位无符号数。解答 .model small .stack 256 .data bufx db?bufY db?bufz db?.code .startup mov al,bufX mov bl,bufY cmp al,bl ja next mov bufZ,bl jmp done next:mov bufZ,al done:.exit 0 end 习题 4.10 设变量 bufX 为有符号16 位数,请将它的符号状态保存在signX,即:如果 X大于等于0,保存 0;如果 X 小于 0,保存-1(ffh)。编写该程序。解答 .model small .stack .data bufX dw-7 signX db?.code .startup cmp bufX,0 ;test bufX,80h jl next ;jnz next mov signX,0 jmp done next:mov signX,-1 done:.exit 0 end 习题 4.11bufX、bufY 和 bufZ 是 3 个有符号16 进制数,编写一个比较相等关系的程序:(1)如果这3 个数都不相等,则显示0;(2)如果这3 个数中有两个数相等,则显示1;(3)如果这3 个数都相等,则显示2。解答 .model small .stack 256 .data bufx dw?bufY dw?bufz dw?.code .startup mov ax,bufX mov bx,bufY mov cx,bufZ mov dl,0 cmp ax,bx jnz next1 inc dl next1:cmp ax,cx jnz next2 inc dl next2:cmp bx,cx jnz next3 inc dl next3:cmp dl,?3?jb next4 mov dl,?2?next4:mov ah,02h ;显示int 21h .exit 0 end 习题 4.12分析第2 章例题 2.42、2.52、2.53 的结构,分别画出它们的流程图。解答2.42 2.52 2.53习题 4.13例题 4.8 内外循环次数共是多少?如果要求按从大到小排序,程序如何修改?解答外循环次数是:count-1 次(19 次)内循环次数是:(count-1)!次(19!次)内外循环次数共是count-1+(count-1)!次,即19+19!次习题 4.14串操作指令常要利用循环结构,现在不用串操作指令实现字符串string1 内容传送到字符串string2,字符长度为count。解答 .model small .stack 256 .data string1 db good morning!len =$-string1 string2 db len dup(?).code .startup mov cx,len ;字符数mov si,offset string1 ;源指针mov di,offset string2 ;目标指针again:mov al,si ;送一个字符mov di,al inc si ;修改指针inc di ;修改指针loop again ;cx=cx-1,cx=0时退出循环 .exit 0 end 习题 4.15不用串操作指令求主存0040h:0 开始的一个64KB 物理段中共有多少个空格?解答这里仅列出主程序段:mov ax,0040h ;送段地址mov ds,ax xor si,si ;偏移量地址xor cx,cx ;计数(循环次数)xor dx,dx ;空格计数器清零again:cmp si,20h ;与空格的ASCII 码比较jne next ;不是空格,转inc dx ;是空格,空格数加1 next:inc si ;修改地址指针loop again ;cx=cx-1,如 cx=0 退出循环 .exit 0 end 习题 4.16编程实现把键入的一个字符,用二进制形式(0/1)显示出它的ASCII 代码值。解答.model small .stack 256 .data stri1 db please input,0dh,0ah,$.code .startup mov dx,offset stri1 mov ah,09h int 21h mov ah,01h int 21h mov cx,8 again:xor dl,dl shl al,1 adc dl,0 mov ah,02h int 21h loop again .exit 0 end 习题 4.17编写程序,要求从键盘接收一个数bellN(0 9),然后响铃bellN 次。解答.model small .stack .data stri1 db please input number:1-9,0dh,0ah,$.code .startup again:mov dx,offset stri1 ;显示 stri1,提示输入mov ah,09h int 21h mov ah,01h ;调用输入一个字符int 21h ;输入一个字符存在al 中cmp al,1 ;判该字符,如不在,1?-,9?jb again ;重新输入cmp al,9 ja again and al,0fh ;在,1?-,9?,屏蔽高4 位mov cl,al ;振铃次数送cx xor ch,ch abc:mov dl,07h ;调用一次振铃mov ah,02h int 21h loop abc .exit 0 end 习题 4.18编写程序,将一个包含有20 个有符号数据的数组arrayM 分成两个数组:正数数组 arrayP 和负数数组arrayN,并分别把这两个数组中的数据个数显示出来。解答.model small include io.inc .stack .data arrayM db 1,2,3,4,5,6,0,-3,-5,-6,0,7,6,90,-18,-23,34,7,9,8 ;源数组 arrayP db 20 dup(?);正数数组 arrayN db 20 dup(?);负数数组 dispP db Plus Number:,$dispN db 0dh,0ah,Negs Number:,$.code .startup mov cx,20 ;源数组元素数xor bx,bx ;设 bh 为正数个数,bl 为负数个数,均清零xor si,si ;源数组地址位移量again:;循环 20 次mov ax,arrayMsi ;取一个元素cmp ax,0 ;判正数jl Neg inc bh ;是,正数个数加1 jmp next Neg:inc bl ;否,负数个数加1 next:inc si ;修改位移量loop again ;循环次数减1 mov ah,09h ;调用显示字符串功能mov dx,offset dispP ;显示个数int 21h mov al,bh call dispuib ;调用 I/O 子程序库中的子程序mov ah,09h ;调用显示字符串功能mov dx,offset dispN ;显示个数 int 21h mov al,bl call dispuib ;调用 I/O 子程序库中的子程序 .exit 0 end 习题 4.19编写计算100 个正整数之和的程序。如果和不超过16 位字的范围(65535),则保存其和到wordsum,如超过则显示,overflow?。解答 .model small .stack .data num equ 100 wlist dw num dup(?)wordsum dw?error db overflow.$.code .startup mov bx,offset wlist mov cx,num xor ax,ax again:add ax,bx jc next inc bx inc bx loop again mov bx,ax jmp done next:mov dx,offset error mov ah,9 int 21h done:.exit 0 end 习题 4.20编程判断主存0070h:0 开始的 1KB 中有无字符串,DEBUG?。这是一个字符串包含的问题,可以采用逐个向后比较的简单算法。解答 .model small .stack .data disp1 db There is DEBUG in the aera!,0dh,0ah,$disp2 db There is no DEBUG in the aera!,0dh,0ah,$.code .startup mov ax,0070h ;送段地址mov ds,ax xor si,si ;地址指针清零mov cx,1024 cmp si,D ;与,D比较jne next ;不是,转inc si ;是,地址增1 cmp si,E ;同上jne next inc si cmp si,B jne next inc si cmp si,U jne next inc si cmp si,G je yes ;是,DEBUG,转next:inc si ;不是,地址增1 loop again ;循环no:mov dx,offset disp2 ;没找到,显示disp2 jmp dsp yes:mov dx,offset disp1 ;找到,显示disp1 dsp:mov ah,09h int 21h .exit 0 end 习题 4.21编程把一个16 位无符号二进制数转换成为用8421BCD 码表示的5 位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以100、10 和 1,得到“百位”、“十位”和“个位”。解答 .model small .stack 256 .data var dw 3546 dbcd db 5 dup(?).code .startup mov ax,var mov bx,10000 mov cl,10 xor si,si xor dx,dx again:div bx mov dbcdsi,al inc si xchg ax,bx div cl xchg ax,bx cmp si,5 jnz again .exit 0 end 习题 4.22过程定义的一般格式是怎样的?子程序入口为什么常有PUSH 指令、出口为什么有 POP 指令?下面的程序段有什么不妥吗?若有,请改正:crazy PROCpush ax xor ax,ax xor dx,dx again:add ax,bx adc dx,0 inc bx inc bx loop again ret ENDP crazy 解答crazy PROC ;crazy PROC push ax ;xor ax,ax ;xor ax,ax xor dx,dx ;xor dx,dx again:add ax,bx ;again:add ax,bx adc dx,0 ;adc dx,0 inc bx ;inc bx inc bx ;inc bx loop again ;loop again ret ;ret ENDP crazy ;crazy ENDP 习题 4.23子程序的参数传递有哪些方法,请简单比较。解答寄存器、共享变量(公共存储单元)、堆栈用寄存器传递参数是把参数存于约定的寄存器中,这种方法简单易行,经常采用;用变量传递参数是主程序与被调用过程直接用同一个变量名访问传递的参数,就是利用变量传递参数。如果调用程序与被调用程序在同一个源程序文件中,只要设置好数据段寄存器 DS,则子程序与主程序访问变量的形式相同,也就是它们共享数据段的变量,调用程序与被调用程序不在同一个源文件中,必须利用public/extern进行声明,才能用变量传递参数,利用变量传递参数,过程的通用性比较差,然而,在多个程序段间,尤其在不同程序的模块间,利用全局变量共享数据也是一种常见的参数传递方法;用堆栈传递参数是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口压入堆栈,主程序弹出堆栈取得它们。习题 4.24采用堆栈传递参数的一般方法是什么,为什么应该特别注意堆栈平衡问题。解答采用堆栈传递参数的一般方法是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数子程序将出口参数压入堆栈,主程序弹出堆栈取得它们。因为堆栈采用“先进后出”原则存取,而且返回地址和保护的寄存器等也要存于堆栈,所以要特别注意堆栈平衡问题。习题 4.25什么是子程序的嵌套、递归和重入?解答子程序中又调用子程序就形成子程序嵌套。子程序中直接或间接调用该子程序本身就形成子程序递归。子程序的重入是指子程序被中断后又被中断服务程序所调用,能够重入的子程序称为可重入子程序。习题 4.26 将例题 4.7 的大写转换为小写字母写成过程,利用AL 作为入口、出口参数完成。解答.model small .stack 256 .data stdng db HeLLO eveRyboDy!,0 .code .startup mov bx,offset atring again:mov al,bx call chan ;调用过程mov bx,al next:inc bx jmp again done:.exit 0 chan proc ;大写转换为小写字母的过程or al,al jz done cmp al,A jb next cmp al,Z ja next or al,20h ret chan endp end 习题 4.27请按如下子程序说明编写过程:;子程序功能:把用ASCII 码表示的两位十进制数转换为对应二进制数;入口参数:DH=十位数的ASCII 码,DL=个位数的ASCII 码;出口参数:AL=对应的二进制数解答astob proc and dh,0fh ;十位数的ASCII 码转为二进制数mov al,dh mul 10 ;al=10*dh and dl,0fh ;个位数的ASCII 码转为二进制数add al,dl ;al=10*dh+dl ret astob endp 习题 4.28写一个子程序,根据入口参数AL=0/1/2,分别实现对大写字母转换成小写、小写转换成大写或大小写字母互换。欲转换的字符串在string 中,用 0 表示结束。解答Change proc Push bx ;保护 bx xor bx,bx ;位移量清零cmp al,0 ;根据入口参数AL=0/1/2,分别处理jz chan_0 dec al jz chan_1 dec al jz chan_2 jmp done chan_0:mov al,stringbx ;实现对大写字母转换成小写cmp al,0 jz done cmp al,?A?;是大写字母jb next0 cmp al,?Z?;是大写字母ja next0 add al,20h ;转换mov stringbx,al next0:inc bx ;位移量加1,指向下一字母jmp chan_0 chan_1:mov al,stringbx ;实现对小写字母转换成大写cmp al,0 jz done cmp al,?a?;是大写字母jb next1 cmp al,?z?;是大写字母ja next1 sub al,20h ;转换mov stringbx,al next0:inc bx ;位移量加1,指向下一字母jmp chan_1 chan_2:mov al,stringbx ;实现对大写字母转换成小写cmp al,0 jz done cmp al,?A?;是大写字母jb next2 cmp al,?Z?;是大写字母ja next20 add al,20h ;转换jmp next2 next20:cmp al,?a?;是大写字母jb next2 cmp al,?z?;是大写字母ja next2 sub al,20h ;转换mov stringbx,al next2:inc bx ;位移量加1,指向下一字母jmp chan_2 done:pop bx ;恢复 bx ret change endp 习题 4.29编制一个子程序把一个16 位二进制数用十六进制形式在屏幕上显示出来,分别运用如下3 种参数传递方法,并用一个主程序验证它。(1)采用 AX 寄存器传递这个16 位二进制数(2)采用 wordTEMP变量传递这个16 位二进制数(3)采用堆栈方法传递这个16 位二进制数解答(1)采用 AX 寄存器传递这个16 位二进制数 .model small .stack .data wdata dw 34abh .code .startup mov ax,wdata call dispa .exit 0;dispa proc push cx push dx mov cl,4 mov dl,ah shr dl,cl call dldisp mov dl,ah and dl,0fh call dldisp mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx ret dispa endp;dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 dldisp1:mov ah,2 int 21h pop ax ret dldisp endp end(2)采用 wordTEMP变量传递这个16 位二进制数 .model small .stack .data wdata dw 34abh wordtemp dw?.code .startup mov ax,wdata mov wordtemp,ax call dispa .exit 0;dispa proc push cx push dx mov cl,4 mov dl,byte ptr wordtemp+1 shr dl,cl call dldisp mov dl,byte ptr wordtemp+1 and dl,0fh call dldisp mov dl,byte ptr wordtemp shr dl,cl call dldisp mov dl,byte ptr wordtemp and dl,0fh call dldisp pop dx pop cx ret dispa endp;dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 dldisp1:mov ah,2 int 21h pop ax ret dldisp endp end(3)采用堆栈方法传递这个16 位二进制数 .model small .stack .data wdata dw 34abh .code .startup push wdata call dispa pop ax ;add sp,2 .exit 0;dispa proc push bp mov bp,sp push ax push cx push dx mov ax,bp+4 mov cl,4 mov dl,ah shr dl,cl call dldisp mov dl,ah and dl,0fh call dldisp mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx pop ax pop bp ret dispa endp;dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 dldisp1:mov ah,2 int 21h pop ax ret dldisp endp end 习题 4.30设有一个数组存放学生的成绩(0 100),编制一个子程序统计0 59 分、60 69 分、70 79 分、80 89 分、90 100 分的人数,并分别存放到scoreE、scoreD、score C、score B 及 score A 单元中。编写一个主程序与之配合使用。解答 .model small .stack .data score db 70,86,90,45,60,96,100,0,.;全班成绩数组count equ$-score ;总人数scoreE db?;0-59 分人数scoreD db?;60-69 分人数scoreC db?;70-79 分人数scoreB db?;80-89 分人数scoreA db?;90-99 分人数 .code .startup lea bx,score mov cx,count again:mov al,bx ;取一个成绩call tjrs ;调用统计分段人数inc bx ;调整指针loog again ;cx-cx-1,cx=0退出循环 .exit 0 tjrs proc;统计分段人数cmp al,60 jae next0 ;al=60 转inc scoreE ;al60,0-59分的人数加1 jmp next4 next0:cmp al,70 jae next1 inc scoreD jmp next4 next1:cmp al,80 jae next2 inc scoreC jmp next4 next2:cmp al,90 jae next3 inc scoreB jmp next4 next3:inc scoreA next4:ret tjrs endp end 习题 4.31编写一递归子程序,计算指数函数X n 的值。解答model small .stack .data x dw 5 n dw 6 zish dw?.code .startup mov bx,x push bx mov bx,n push bx mov bx,x call zshhsu pop zish add sp,2 .exit 0 zshhsu proc push bx push ax push bp mov bp,sp mov ax,bp+8 cmp ax,0 jne zshhsu1 inc ax jmp zshhsu2 zshhsu1:dec ax push bx push ax call zshhsu pop ax pop bx mul bx zshhsu2:mov bp+8,ax pop bp pop ax pop bx ret zshhsu endp end

    注意事项

    本文(第4章基本汇编语言程序设计.pdf)为本站会员(索****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开