第4章基本汇编语言程序设计.pdf
《第4章基本汇编语言程序设计.pdf》由会员分享,可在线阅读,更多相关《第4章基本汇编语言程序设计.pdf(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 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 qva
2、rsi 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
3、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 寄存器中。解答思路
4、:设这四组从低位到高位分别放在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
5、;从键盘输入,出口: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)转换
6、成对应的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.
7、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
8、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 ;
9、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
10、 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 次)内循环次数
11、是:(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 ;目标指
12、针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 ;是空格,空格
13、数加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,0
14、2h 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 ;重
15、新输入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,
16、-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
17、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 位
18、字的范围(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 d
19、one:.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比较j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 汇编语言 程序设计
限制150内