版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第三次实验1、 从键盘上输入一个十六进制数,将其转换成一个十进制数显示。准备工作:此试验的难度之一在于如何将输入的十六进制数AF的ASCII代码转换成十进制数的ASCII代码。我原本一直是这样想的,于是进入了死胡同。于是换个思路,把A到F的ASCII代码进行某种运算,使他等于要输出的十进制数,然后分别输出个位和十位。 流程图如下:程序:DATA SEGMENT DATA1 DB 0;定义一个数据段存放AL的低位 DATA2 DB 0;存放AL的高位DATA ENDSSTACK SEGMENT DB 5 DUP(?);定义一个栈段暂时存放ALSTACK ENDSCODE SEGMENTASSU
2、ME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX;把数据段的首地址即段地址给DS mov ax,stack mov ss,ax;把栈段的段地址给SS Mov cl,4;设置偏移量input: mov ah,01 int 21h;等待输入 push ax;把AX的值暂时存放在栈段里 cmp al,'0';和零的ASCII代码比较 jb input;小于则重新输入 cmp al,'9';和九的ASCII代码比较 jbe output;不大于则跳转到output cmp al,'A';和A的
3、ASCII代码比较 jb input;小于则重新输入 cmp al,'F';和F的ASCII代码比较 jbe change;不大于则跳转到change cmp al,'a'和a的ASCII代码比较 jb input;小于重新输入 cmp al,'f';和f的ASCII代码比较 jbe exchange;不大于则跳转到exchange jmp input;否则重新输入output: mov dl,al mov ah,2h int 21h jmp input;AL的值为数字,则原样输出change: or al,00100000B;AL和001000
4、00逻辑或,转换成大写字母 jmp exchange;跳转到exchangeexchange: sub al,51h;AL减51H and al,00001111b;把AL与00001111逻辑与,高位置零 Add al,30h;把低位转换成十进制对应的ASCII代码 mov data2,al;把低位存入DS:DATA2 pop ax;取出原AX sub al,51h Shr al,cl;右移4位 Add al,30h; mov data1,al;把高位保存在DS:DATA1中output2: mov dl,data2; mov ah,2h int 21h;输出高位 mov dl,data1
5、mov ah 2h int 21h:输出低位 code ends start endQuestion1 原因分析:push和pop不能和8位寄存器使用Question2分析:指令格式错误,正确的应该是,前面还要填上mov cl,4 ,shl al,clQuestion2分析:少了冒号错误全部修改好了,运行结果是这样的 不是预期的效果.看了一下程序,把output里的mov dl,ss:0改成mov dl,al,可以正确输出数字了,但是字母不是这个原因,下面调试调试看看:输入e目前一切正常然后快速进行到输出ds:data1输出小图案的ascii代码是5,错把应该输出的十进制数保存在内存里,应该加
6、上30H转换成ASCII代码。修改过后2、 判断闰年的程序程序data segmentinfon db 0dh,0ah,'Please input a year: $'Y db 0dh,0ah,'This is a leap year! $'N db 0dh,0ah,'This is not a leap year! $'w dw 0buf db 8 db ? db 8 dup(?) data endsstack segment stackdb 200 dup(0)stack endscode segmentassume ds:data,ss:s
7、tack,cs:codestart:mov ax,datamov ds,ax lea dx,infonmov ah,9int 21hlea dx,bufmov ah,0Ahint 21hxor ch,chmov cl, buf+1call datacatecall ifyearsjc a1lea dx,nmov ah,9int 21hjmp exita1: lea dx,ymov ah,9int 21hexit: mov ah,4chint 21hdatacate proc nearpush cx dec cxlea si,buf+2tt1: inc siloop tt1pop cxmov a
8、x,1l1: push ax mov dh,30hmov bx,10mov dl,sisub dl,dh xor dh,dhmul dx add w,axpop axmul bxdec siloop l1retdatacate endpifyears proc near push bxpush cxpush dx mov ax,w mov dx,0 mov bx,100div bxcmp dx,0 je nextxor dx,dxmov ax,wmov bx,4 div bxcmp dx,0je lab2jmp lab1 next: xor dx,dxmov ax,w mov bx,400di
9、v bx cmp dx,0 je lab2jmp lab1lab1: clc jmp lab3lab2: stclab3: pop dx pop cxpop bxretifyears endpcode endsend start流程图3. (1)两个一位数变量的加法 DATA SEGMENTDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AH,1 INT 21H;输入一个变量 SUB AL,30H MOV BL,AL;把变量转换成十进制数存在BL里 MOV AH,2 MOV DL,2BH IN
10、T 21H;输出加号 MOV AH,1 INT 21H;输入另一个变量 SUB AL,30H ADD AL,BL;两变量的十进制形式相加 AAM ;加法调整,两个数不用转换成二进制,直接进行加法运算,高位 PUSH AX;保存在AH,低位保存在AL中 POP BX MOV AH,2 MOV DL,3DH;输出等号 INT 21H MOV AH,2 MOV DL,BH ADD DL,30H;输出高位 INT 21H MOV AH,2 MOV DL,BL ADD DL,30H INT 21H MOV AH,4CH INT 21H CODE ENDS END START运行结果: 新学的指令AAM是
11、此题的关键!,它能把二进制修正成十进制显示。AAM也有局限性,AL中的数值必须小于等于99,否则出错。AAM.AAA,AAS用于非压缩BCD码,DAA,DAS用于压缩BCD码。(2) 两位数的变量加法流程图此实验耗费时间较长,且结果是这样的加法不等于真实结果?只好调试:源程序是定义的w1和w2都是一个字节的数据段,导致把加数和被加数存在里面时,产生了覆盖调整定义的w1和w2的字节为2,继续运行,结果还是不对.然后继续调试,发现置STC用错了,我的本意是让个位相加如果产生进位就置一,但是结果是不论有么有进位都置一了,还有个位十位输出顺序反了.比如我先后输入12和34 结果是46,但是显示的是74
12、.对STC的用法不熟,不知道在满足条件的时候置一。而我恰恰不知道如何在满足条件的条件下置CF为一,百度了一下,没有.然后就这老师给的汇编指令大全,挨个看了一下,发现CMP a,b,如果a>=b,则cf等于零,那么我想a<B,那么cf是不是就置一了,一运行,果然可以!下面是我的程序:(在老师闰年的基础上大改动,应用了一位数变量的加法)data segmentinfon db 0dh,0ah,'Please input a number: $'w1 db 2 dup(0);存放加数w2 db 2 dup(0);存放另一个加数w db 00;存放和buf db 8 db
13、? db 8 dup(?) data endsstack segment stackdb 200 dup(0)stack endscode segmentassume ds:data,ss:stack,cs:codestart:mov ax,datamov ds,ax lea dx,infonmov ah,9int 21hcall input;调用输入子程序,输入加数call datacate;调用子程序,把加数以十进制形式存在w1里mov dl,10mov ah,02int 21h;输出转行call input;调用输入子程序,输入另一个加数mov dl,10mov ah,02int 21h
14、;输出转行call datacate1;调用子程序call add1;调用相加子程序exit: mov ah,4chint 21h;退出input proc near lea dx,buf mov ah,0Ah int 21h xor ch,ch mov cl, buf+1 retinput endp;输入加数,和闰年实验一样datacate proc near dec cx lea si,buf+2 tt1: inc si loop tt1 mov cx,2;和闰年实验一样l1: mov dh,30h;备用,把加数的ASCII代码减去它 mov al,si;把加数个位存到此 mov bl,a
15、l; sub bl,dh dec si;自减 mov al,si;把加数十位存到此 mov bh,al sub bh,dh mov w1,bh; mov w1+1,bl;把bx即加数存到w1中 retdatacate endp;和上一个子程序类似,不过是另一个加数datacate1 proc near dec cx lea si,buf+2 tt1: inc si loop tt1 mov cx,2l1: mov dh,30h mov al,si mov bl,al sub bl,dh dec si mov al,si mov bh,al sub bh,dh mov w2,bh mov w2+
16、1,bl retdatacate1 endpadd1 proc nearxor ah,ah mov al,w1+1;把加数个位给al mov bl,w2+1;把另一个加数个位给bl add al,bl;al,bl相加 Aam;加法调整 Clc;cf位清零 cmp ah,1;al位和1比较,等于1则CF等于1 mov w,al;把个位相加结果存放到w中 mov al,w1 mov bl,w2 adc al,bl;bl,al,cf相加,十位和进位相加 Aam;加法调整 mov bx,axadd bh,30hmov ah,02mov dl,bhint 21h;输出百位mov ah,02add bl,
17、30hmov dl,blint 21h;输出十位mov bl,byte ptr wmov ah,02add bl,30hmov dl,bl;输出个位int 21hretadd1 endpcode endsend start;结束3、 十五位数相加对上一个程序稍加修改,要用到循环指令,流程图暂时不画。程序如下data segmentinfon db 0dh,0ah,'Please input a number: $'w1 db 45 dup(0);存加数、被加数,和buf db 16 db ? db 16 dup(?) data endsstack segment stackdb
18、 200 dup(0)stack endscode segmentassume ds:data,ss:stack,cs:codestart:mov ax,datamov ds,ax lea dx,infonmov ah,9int 21hcall input;输入加数call datacate;把加数以十进制形式存入的子程序mov dl,10mov ah,02int 21hcall input;输入被加数mov dl,10mov ah,02int 21hcall datacate1;把被加数以十进制形式存入的子程序call add1;两数求和的子程序exit: mov ah,4chint 21h
19、input proc near lea dx,buf mov ah,0Ah int 21h xor ch,ch mov cl, buf+1 retinput endpdatacate proc near dec cx lea si,buf+2 tt1: inc si loop tt1 mov cx,15 mov dh,30h xor di,dil1: mov bl,si sub bl,dh dec si mov w1+di,bl inc di loop l1 retdatacate endpdatacate1 proc near dec cx lea si,buf+2 tt1: inc si loop tt1 mov cx,15 mov dh,30h xor di,dil2: mov al,si mov bl,al sub bl,dh dec si mov w1+di+15,bl inc di loop l2 retdatacate1 endpadd1 proc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026西藏山南市加查县文旅局公益性岗位1人备考考试试题附答案解析
- 2026上半年云南事业单位联考民族中学招聘2人备考考试试题附答案解析
- 2026河南洛阳涧西区招聘25名备考考试试题附答案解析
- 2026河南信阳市潢川县应急管理局招聘全日制公益性岗位2人参考考试试题附答案解析
- 2026福建三明市永安市罗坊乡人民政府招聘编外聘用驾驶员1人备考考试试题附答案解析
- 市政处安全生产责任制度
- 如何对生产设备管理制度
- 食品小作坊生产自查制度
- 危货企业安全生产制度
- 五金厂安全生产职责制度
- 电磁辐射环境下的职业健康防护
- 2026年及未来5年中国芋头行业市场发展现状及投资方向研究报告
- 中药外洗治疗化疗导致外周神经毒课件
- 2025-2026学年人教版(新教材)小学数学三年级下册(全册)教学设计(附目录P208)
- 2025版中国慢性乙型肝炎防治指南
- 2026年及未来5年市场数据中国草酸行业发展前景预测及投资战略数据分析研究报告
- 感染科结核病防治培训指南
- 金属水幕施工方案(3篇)
- 2025美国心脏协会心肺复苏(CPR)与心血管急救(ECC)指南解读
- 2024-2025学年浙江省金华市兰溪市一年级(上)期末数学试卷
- 广东省珠海市香洲区2023-2024学年八年级上学期语文期末试卷(含答案)
评论
0/150
提交评论