第4章例题源程序
- 格式:doc
- 大小:84.50 KB
- 文档页数:8
汇编语言程序设计(第四版)第4章【课后答案】汇编语言程序设计第四版【课后习题答案】--囮裑為檤第4章基本汇编语言程序设计〔习题4.1〕例题4.2如果要求算术右移8位,如何修改程序。
〔解答〕思路:首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h到最高位字节;如为1,送ffh到最高位字节。
传送可参考例题4.2,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成:.model small.stack 256.dataqvar dq 1234567887654321h.code.startupmov cx,7mov si,1again: mov al, byte ptr qvar[si]mov byte ptr qvar[si-1],alinc siloop againtest al,80hjz ezzmov bl,0ffhjmp doneezz: mov bl,0done: mov byte ptr qvar[7],bl.exit 0end〔习题4.2〕例题4.2如果要求算术左移7位,如何用移位指令实现。
〔解答〕思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次,次低位字节至最高位字节依次带CF 位循环左移一次(内循环共8次),外循环体控制执行7次即可。
.model small.stack 256.dataqvar dq 1234567887654321h.code.startupmov dx, 7 ;外循环次数mov ax, byte ptr qvar[0] ;最低位字节送axlpp: shl ax, 1 ;最低位字节左移一次,其d7移入CF位mov si, 1mov cx, 7 ;内循环次数again: rcl byte ptr qvar[si], 1 ;高位字节依次左移P50inc siloop againdec dxjnz lpp.exit 0.end〔习题4.3〕将AX寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL、BL、CL和DL寄存器中。
*教材:机械工业出版社主编《80x86汇编语言程序设计》第2版•马力妮CH1思考题:1-2、7-8、12、14【1.1】填空题(1)把汇编语言源程序转换为相应的目标程序的翻译程序称为(),这个翻译过程称为()。
(2)汇编语言源程序经()后,形成目标文件,再经()后,形成可执行文件。
(3)()是计算机中表示信息的最小单位,8位二进制数为一个(),而()是在操作中作为一个单元处理的一组数据。
(4)BCD码有两种存储方式:()和()。
(5)8位二进制的无符号数可表示的最大范围为()。
8位二进制的带符号数可表示的最大范围为()。
【1.2】选择题(1)下面各8位二进制数的补码中,绝对值对小的是()A. 01111111B. 10000001C. 01101101D.11111111(2)补码11001000表示的十进制真值是( )A. 200B. –200C. –56D. -184(3)16位带符号数所能表示的范围是( )A.–32767~+32768B.0~65535C.-65535~+65536D.-32768~+32767(4)与100.5不相等的数据是()A. 64.8HB. 1100100.1BC. 64.5HD. 144.4Q(5)将目标程序转换为可执行程序的是()A. 编辑程序B. 汇编程序C. 连接程序D.调试程序【1.7】将下列二进制数转换为十六进制数和十进制数。
(1)101011 B(2)11010011B (3)10110101B (4)1101100B【1.8】将下列十六进制数转换为二进制数和十进制数。
(1)2DH (2)1512H (3)1C5H (4)21F0H【1.12】将下列十进制数分别用组合型BCD码和非组合型BCD码表示。
(1)35 (2)74 (3)98 (4)14【1.14】有一个8位的数值00110101,回答问题:(1)如果它是一个二进制数,它表示的十进制数是多少?(2)如果它是BCD码,它表示的数是什么?(3)如果它是ASCII码,它表示的字符是什么?CH2思考题:1-3、6--9、11-12、16书面题:10、13-15【2.1】填空题(1)微型计算机硬件系统结构主要是由三部分组成,它们是()、()、()。
100个经典c语言例题(带答案)经典C源程序100例- -1 经典C源程序100例【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:m...C语言经典程序100例2009-02-26 19:44 | (分类:默认分类)经典C源程序100例- -1 经典C源程序100例【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:main(){int i,j,k;printf("\n");for(i=1;i<5;i++)/*以下为三重循环*/for(j=1;j<5;j++)for (k=1;k<5;k++){if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/printf("%d,%d,%d\n",i,j,k);}}==============================================================【程序2】题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。
例4.1 建立一个命令文件将变量a,b 的值互换,然后运行该命令文件。
程序1:首先建立命令文件并以文件名exch.m 存盘:clear;a=1:10;b=[11,12,13,14;15,16,17,18];c=a;a=b;b=c;ab然后在MA TLAB 的命令窗口中输入exch ,将会执行该命令文件。
程序2:首先建立函数文件fexch.m :function [a,b]=exch(a,b)c=a;a=b;b=c;然后在MA TLAB 的命令窗口调用该函数文件:clear;x=1:10;y=[11,12,13,14;15,16,17,18];[x,y]=fexch(x,y)例4.2 求一元二次方程ax 2+bx+c=0的根。
a=input('a=?');b=input('b=?');c=input('c=?');d=b*b-4*a*c;x=[(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)];disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);例4.3 计算分段函数:cos(1)1010x x y x ⎧++=⎪=⎨⎪≠⎩x=input('请输入x 的值:');if x==10y=cos(x+1)+sqrt(x*x+1);elsey=x*sqrt(x+sqrt(x));endy也可以用单分支if 语句来实现:x=input('请输入x 的值:');y=cos(x+1)+sqrt(x*x+1);if x~=10y=x*sqrt(x+sqrt(x));endy或用以下程序:x=input('请输入x的值:');if x==10y=cos(x+1)+sqrt(x*x+1);endif x~=10y=x*sqrt(x+sqrt(x));endy例4.4输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出。
c=input('请输入一个字符','s');if c>='A' & c<='Z'disp(setstr(abs(c)+abs('a')-abs('A')));elseif c>='a'& c<='z'disp(setstr(abs(c)- abs('a')+abs('A')));elseif c>='0'& c<='9'disp(abs(c)-abs('0'));elsedisp(c);end例4.5某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示):price<200 没有折扣200≤price<500 3%折扣500≤price<1000 5%折扣1000≤price<2500 8%折扣2500≤price<5000 10%折扣5000≤price 14%折扣输入所售商品的价格,求其实际销售价格。
price=input('请输入商品价格');switch fix(price/100)case {0,1} %价格小于200rate=0;case {2,3,4} %价格大于等于200但小于500rate=3/100;case num2cell(5:9) %价格大于等于500但小于1000rate=5/100;case num2cell(10:24) %价格大于等于1000但小于2500rate=8/100;case num2cell(25:49) %价格大于等于2500但小于5000rate=10/100;otherwise %价格大于等于5000rate=14/100;endprice=price*(1-rate) %输出商品实际销售价格例 4.6 矩阵乘法运算要求两矩阵的维数相容,否则会出错。
先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。
A=[1,2,3;4,5,6];B=[7,8,9;10,11,12];tryC=A*B;catchC=A.*B;endClasterr %显示出错原因例 4.7 一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。
输出全部水仙花数。
for m=100:999m1=fix(m/100); %求m 的百位数字m2=rem(fix(m/10),10); %求m 的十位数字m3=rem(m,10); %求m 的个位数字if m==m1*m1*m1+m2*m2*m2+m3*m3*m3disp(m)endend例4.8 已知 22221312111n y ++++= ,当n=100时,求y 的值。
y=0;n=100;for i=1:ny=y+1/i/i;endy在实际MA TLAB 编程中,为提高程序的执行速度,常用向量运算来代替循环操作,所以上述程序通常由下面的程序来代替:n=100;i=1:n;f=1./i.^2;y=sum(f)例4.9 设)6sin()(5.0π+=-x e x f x ,求s=⎰πdx x f 30)(。
a=0;b=3*pi;n=1000; h=(b-a)/n;x=a; s=0;f0=exp(-0.5*x)*sin(x+pi/6);for i=1:nx=x+h;f1=exp(-0.5*x)*sin(x+pi/6);s=s+(f0+f1)*h/2;f0=f1;ends上述程序来源于传统的编程思想。
也可以利用向量运算,从而使得程序更加简洁,更赋有MATLAB 的特点。
程序如下:a=0;b=3*pi;n=1000; h=(b-a)/n;x=a:h:b;f=exp(-0.5*x).*sin(x+pi/6);for i=1:ns(i)= (f(i)+f(i+1))*h/2;ends=sum(s)例4.10 写出下列程序的执行结果。
s=0;a=[12,13,14;15,16,17;18,19,20;21,22,23];for k=as=s+k;enddisp(s');例4.11 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。
sum=0;n=0;x=input('Enter a number (end in 0):');while (x~=0)sum=sum+x;n=n+1;x=input('Enter a number (end in 0):');endif (n>0)summean=sum/nend例4.12 根据矩阵指数的幂级数展开式求矩阵指数。
++++++I =!!3!232n X X X X e nXX=input('Enter X:');E=zeros(size(X));F=eye(size(X));n=1;while norm(F,1)>0E=E+F;F=F*X/n;n=n+1;endEexpm(X) %调用MATLAB矩阵指数函数求矩阵指数例4.13求[100,200]之间第一个能被21整除的整数。
for n=100:200if rem(n,21)~=0continueendbreakendn例4.14若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。
求[1,500]之间的全部完数。
例4.15 用筛选法求某自然数范围内的全部素数。
m=input('m=');p=1:m; p(1)=0;for i=2:sqrt(m)for j=2*i:i:mp(j)=0;endendn=find(p~=0);p(n)关于在p中划去i的倍数(不包括i),可利用矩阵运算一步完成,从而得到更为简洁的程序:m=input('m=');p=2:m;for i=2:sqrt(m)n=find(rem(p,i)==0&p~=i);p(n)=[];endp例4.16编写函数文件求半径为r的圆的面积和周长。
函数文件如下:function [s,p]=fcircle(r)%CIRCLE calculate the area and perimeter of a circle of radii r%r 圆半径%s 圆面积%p 圆周长%2006年2月30日编s=pi*r*r;p=2*pi*r;将以上函数文件以文件名fcircle.m存盘,然后在MA TLAB命令窗口调用该函数:[s,p]=fcircle(10)例4.17利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。
函数文件tran.m:function [rho,theta]=tran(x,y)rho=sqrt(x*x+y*y);theta=atan(y/x);调用tran.m的命令文件main1.m:x=input('Please input x=:');y=input('Please input y=:');[rho,the]=tran(x,y);rhothe例4.18利用函数的递归调用,求n!。
function f=factor(n)if n<=1f=1;elsef=factor(n-1)*n; %递归调用求(n-1)!end在命令文件main2.m中调用函数文件factor.m求s=1!+2!+3!+4!+5!。
s=0;for i=1:5s=s+factor(i);ends例4.19 任意排列问题。
MATLAB提供的函数randperm(n),可以产生一个从整数1到整数n的任意排列。
编写一个函数来实现randperm(n)函数的功能,即给出一个由任意数组成的行向量,然后产生这个行向量元素的任意排列。
function Y=rndprm1(X)%RNDPRM1 用for循环产生一个行向量的任意排列%RNDPRM1(X)产生行向量X的任意排列[m,n]=size(X);if m>1error('RNDPRM1 accepts as inputs only vectors');endY=[]; %从一个空矩阵开始l=n; %X的元素个数for i=1:nk=1+fix(l*rand); %随机选择Y的下一个元素的位置x=X(k); %被选择的元素Y=[Y,x]; %将X添加到Y中X(k)=[]; %从X中删除x元素l=l-1 ; %更新X的元素个数end第二个程序用函数的递归调用:function Y=rndprm2(X)%RNDPRM2 用递归调用产生一个行向量的任意排列%RNDPRM2(X)产生一个X的任意排列[m,n]=size(X);l=n;if m>1error('RNDPRM2 accepts as inputs only vectors') endif n<=1Y=X;elsek=1+fix(l*rand); %随机选择Y的下一个元素的位置x=X(k); %被选择的元素X(k)=[]; %从X中删除x元素 Z=rndprm2(X); %将剩下的元素随机排列Y=[Z,x]; %构造输出向量l=l-1;end例4.20nargin用法示例。