已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章 汇编语言程序设计4-2 下列程序执行后,寄存器AX,BX,CX的内容分别是多少?D SEGMENT AT 0202H;定位数据段地址ORG 0202H ;定位偏移地址DA_WORD DW 20HMOV AX,DA_WORD ;(AX)=0020HMOV BX,OFFSET DA_WORD ;(BX)=0202HMOV CL,BYTE PTR DA_WORD ;(CL)=20H(将变量DA_WORD的属性改变为字节型)MOV CH,TYPE DA_WORD ;(CH)=2(变量类型数值) ;(CX)=0220H4-4 试编制一程序,把CHAR1中各小写字母分别转换为对应的大写字母,并存放在CHAR2开始的单元中(题目要求:不改变CHAR1的内容)方法1,小写字母转换一个输出显示一个,前3种方法均使用了AL寄存器D SEGMENT CHAR1 DB abcdefghijklmnopqrstuvwxyzN EQU $-CHAR1;变量必须先定义后使用,而不能相反CHAR2 DB N DUP(0) ; ;不能把此句与上一句对调,CHAR2 DB $-CHAR1有;的同学这样写,错在哪 D ENDS S SEGMENT STACK DB 200 DUP(0)S ENDS C SEGMENT ASSUME CS:C,DS:D,SS:S ;ASSUME是伪指令,后面不能写冒号 START: MOV AX,D MOV DS,AX ;MOV ES,AX ;只要用到串操作指令且DILEA SI,CHAR1 ;MOV SI,OFFSET CHAR1LEA DI,CHAR2 ; MOV DI,OFFSET CHAR2MOV CX,N ;$-CHAR1,不可以AGAIN:MOV AL,SISUB AL,20H ;AND AL,5FH 有的同学是这样实现的 MOV DI,AL MOV DL,AL MOV AH,2INT 21H ;从屏幕显示 INC SI INC DI LOOP AGAIN MOV AH,4CHINT 21H ; ;不是必须的C ENDS END START方法2:使用通用数据传送指令MOVD SEGMENT CHAR1 DB abcdefghijklmnopqrstuvwxyzN EQU $-CHAR1;变量必须先定义后使用,而不能相反CHAR2 DB N DUP(0);不能把此句与上一句对调 D ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS ;P126(代码段和堆栈段是不可少的)C SEGMENT ASSUME CS:C ,DS:D ,SS:S START: MOV AX,D MOV DS,AX MOV ES,AX ;只要用到串操作指令且DIMOV SI,0 ;MOV DI,0 ;MOV CX,NAGAIN: MOV AL,CHAR1SI ; SUB AL,20H20什么意思 MOV CHAR2DI,AL ; INC SI INC DI LOOP AGAIN MOV AH,4CHINT 21H ;不是必须的C ENDS END START 第3种方法:使用串的读写指令LODSB STOSBD SEGMENT CHAR1 DB abcdefN EQU $-CHAR1 CHAR2 DB $-CHAR1 DUP(0) D ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDS C SEGMENT ASSUME CS:C,DS:D,SS:S START: MOV AX,D MOV DS,AX MOV ES,AX MOV SI,OFFSET CHAR1 ;LEA SI,CHAR1MOV DI, OFFSET CHAR2 ;LEA DI,CHAR2MOV CX,NCLD ;不写(隐含)也是0(递增)但不能STDAGAIN: LODSB ;执行一次,隐含修改SISUB AL,32 STOSB ;MOV DI,AL;执行一次, 隐含修改DI INC DI LOOP AGAIN ;LOOP指令只修改CX,不管SI,DIMOV AH,4CHINT 21H ;不是必须的C ENDS END START 第四种方法2006级,没有显示使用MOVSB指令D SEGMENT CHAR1 DB abcdefghijklmnopqrstuvwxyzN EQU $-CHAR1CHAR2 DB N DUP(0) D ENDS S SEGMENT STACK DB 200 DUP(0)S ENDS C SEGMENT ASSUME CS:C,DS:D,SS:S START: MOV AX,D MOV DS,AX MOV ES,AX LEA SI,CHAR1 LEA DI,CHAR2 MOV CX,NAGAIN:MOVSB ; SUB SI,20H DEC DI ; MOVSB SUB BYTE PTRDI,20H ;LOOP AGAIN 错在哪里?结果如何? INC DI LOOP AGAIN MOV AH,4CH INT 21H C ENDS END START 方法5: 只用一个地址指针SI D SEGMENT CHAR1 DB abcdefghijklmnopqrstuvwxyzN EQU $-CHAR1CHAR2 DB N DUP(0) D ENDS S SEGMENT STACK DB 200 DUP(0)S ENDS C SEGMENT ASSUME CS:C,DS:D,SS:S START: MOV AX,D MOV DS,AX MOV ES,AX MOV SI,0 MOV CX,NAGAIN:MOV AL,CHAR1SI ;只用一个地址指针,SICHAR1是错误的 SUB AL,20H MOV CHAR2SI,AL INC SI LOOP AGAIN int 3 MOV AH,4CH INT 21H C ENDS END START 有的同学按数据是由键盘录入的来考虑的,也可行,程序中还有不少问题方法6:由键盘输入小写字母再转换输出,回车符也占一个字节,输入需要小写转换成大写字母的内容从输入串的第3个元素开始D SEGMENT A DBCHAR1,0DH,0AH,$ B DBCHAR2,0DH,0AH,$ CHAR1 DB 11,?,11 DUP(0);准备输入10个小写字母CHAR2 DB 10 DUP(0)D ENDS S SEGMENT STACK DB 200 DUP(0)S ENDS C SEGMENT ASSUME CS:C,DS:D,SS:S START: MOV AX,D MOV DS,AX MOV ES,AX MOV DX,OFFSET A MOV AH,9 INT 21H LEA DX,CHAR1 MOV AH,0AH INT 21H ;由键盘输入字符串,10个字母(显示),1个回车,共11个字节 LEA SI,CHAR12 LEA DI,CHAR2 MOV CX,10 ;需要转换的字符长度为10个字节AGAIN:MOV AL,SI SUB AL,20H MOV DI,AL INC SI INC DI LOOP AGAIN ; 将小写字母字符串转换成大写字母字符串 MOV BYTE PTRDI,0DH INC DI MOV BYTE PTRDI,0AH INC DI MOV BYTE PTRDI,$ ;必须指明数据类型 MOV DX,OFFSET CHAR2 MOV AH,9 INT 21H ;输出$结尾的大写字母字符串 int 3 MOV AH,4CH INT 21H C ENDS END START4-6在BUF地址处起,存放有100个字节的字符串,设其中有一个以上的“A”字符,编程查找出第一个“A”字符相对起始地址的距离,并将其存入LEN单元。方法1,经过调试,数据串长ND SEGMENT BUF DB qasdA%9F26HsdfhA$#12345678 DB DFGH234546JII2334JI5467OPPAVG DB ASDFG45667RTY ; 必须写实际的N EQU $-BUFLEN DW 0;为变量LEN保留一个字,必须先定义后使用,LEN DW ?D ENDS S SEGMENT STACK DB 200 DUP(0)S ENDSC SEGMENT ASSUME CS:C,DS:D,SS:S START: MOV AX,D MOV DS,AX MOV ES,AX ;这条指令是必须的 MOV CX,N LEA DI,BUF ;MOV DI,OFFSET BUF MOV AL,41H ;MOV AL,A REPNE SCASB ;有的同学用的比较指令 MOV LEN,DI-1错在哪里 ,MOV LEN,OFFSET BUFDI-1对不对 或LEA LEN,BUFDI-1 MOV AH,4CH INT 21HC ENDS END START 4-8 某程序设置的数据区如下所示,画出该数据段内容在内存中的存放形式(要用十六进制补码表示,按字节组织) 12H 34H 00H 56H 78H 00H 90H 00H 46H ABH 34H 12H 00H 00H 04H 00H 10H 00H 00H 00H 00H 00H 00H0000H DB10004H DW1000CH ADR1000EH ADR20010H AAA0012H BUF DATA SEGMENT DB1 DB 12H,34H,0,56H DW1 DW 78H,90H,0AB46H,1234H ADR1 DW DB1 ;取变量DB1的偏移地址 ADR2 DW DW1 ;;取变量DW1的偏移地址 AAA DW $-DB1 ;计算当前变量到DB1变量的字节数 BUF DB 5 DUP(0) DATA ENDS有的同学认为0AB46H是负数,并取了它的补码 2 4-10 以BUF1和BUF2开头的2个字符串,其长度均为LEN,试编程实现: (1)将BUF1开头的字符串送到BUF2开始的内存空间。 (2)将BUF1开始的内存空间全部清零。经过调试的:方法1:数据段与附加段重叠,利用MOVSB指令实现数据传的复制D SEGMENTD1 DB BUF1QWE233459JKGHGFHGF;看清题目要求,写出实际内容对存储器初始化,分配内存空间,不能偷懒LEN DB $-D1D2 DB BUF2ASD33459JKGHGFHGFI;长度与D1相同D ENDSS SEGMENT STACKDB 200 DUP(0)S ENDSC SEGMENT ASSUME CS:C,DS:D,SS:S STAR: MOV AX,DMOV DS,AXMOV ES,AX ;附加段与数据段重叠,是允许的LEA SI,D1LEA DI,D2MOV CX,LENREP MOVSB LEA DI,D1MOV CX,LEN ;这条语句不能少MOV AL,00H ;MOV AX,0错在哪REP STOSBMOV AH,4CHINT 21HC ENDS END STAR经过调试的:方法2;数据段与附加段分开,串读一个写一个实现数据的传送,再利用串写指令使指定存储区清零D SEGMENT D1 DB BUF1qasdA%9F26HsdfhA$#12345678LEN EQU $-D1D ENDS E SEGMENTD2 DB BUF2abcdefghijklmnopqrstuvwxyz0 ; 必须写实际的,;与D1长度相同E ENDS S SEGMENT STACK DB 200 DUP(0)S ENDSC SEGMENT ASSUME CS:C,DS:D,SS:S START: MOV AX,D MOV DS,AX MOV AX,EMOV ES,AX MOV CX,N LEA SI,D1 ;MOV SI,OFFSET D1 LEA DI,D2 LP: LODSBSTOSBLOOP LP ;LOOP只是使CX减1,不改变SI DI LEA DI,D1 MOV CX,N ;这条语句不能少 MOV AL,00H REP STOSB MOV AH,4CH INT 21HC ENDS END START第3种做法:传送一个字节清零一个字节,再向下一个字节进行D SEGMENTD1 DB BUF1QWE233459JKGHGFHGF;看清题目要求,写出实际内容对存储器初始化,分配内存空间,不能偷懒LEN DB $-D1D2 DB BUF2ASD33459JKGHGFHGFI;长度与D1相同D ENDSS SEGMENT STACKDB 200 DUP(0)S ENDSC SEGMENT ASSUME CS:C,DS:D,SS:SSTAR: MOV AX,DMOV DS,AXMOV ES,AXLEA SI,D1LEA DI,D2MOV CX,LENNEXT:MOV AL,SIMOV DI,ALMOV SI,00HINC SIINC DILOOP NEXTMOV AH,4CHINT 21HCSEG ENDS END STAR方法4;4-10-4从键盘输入初值,并显示D SEGMENT BUF1 DB 101,?,101 DUP(0)BUF2 DB 100 DUP(0)BUF3 DB 100 DUP(0)A DB BUF1,0DH,0AH,$B DB BUF2,0DH,0AH,$D ENDS S SEGMENT STACK DB 200 DUP(0)S ENDSC SEGMENT ASSUME CS:C,DS:D,SS:S START: MOV AX,D MOV DS,AX MOV ES,AX MOV DX,OFFSET A MOV AH,9 INT 21H ;输出显示BUF1 MOV DX,OFFSET BUF1 MOV AH,0AH INT 21H ;键盘输入字符串 MOV CL,BUF1+1 ;实际输入的字符串长度送CL,取相应单元的内容需加方括号 MOV CH,0 PUSH CX CLD LEA SI,BUF1+2 LEA DI,BUF2 REP MOVSB ;将输入的字符串传送到BUF2 MOV BYTE PTRDI,0DH INC DI MOV BYTE PTRDI,0AH INC DI MOV BYTE PTRDI,$;在BUF2末尾输入回车换行和$ MOV SI,OFFSET BUF3 MOV DI,OFFSET BUF1+2;取变量的偏移地址,不能加方括号 POP CX REP MOVSB ;用BUF3替换BUF1 MOV BYTE PTRDI,0DH INC DI MOV BYTE PTRDI,0AH INC DI MOV BYTE PTRDI,$;在BUF1末尾输入回车换行和$ MOV DX,OFFSET A MOV AH,9 INT 21H ;输出显示BUF1 MOV DX,OFFSET BUF1+2 MOV AH,9 INT 21H ;输出空格,因为BUF1已经清零了 MOV DX,OFFSET B MOV AH,9 INT 21H ;输出显示BUF2 MOV DX,OFFSET BUF2 MOV AH,9 INT 21H ;输出BUF2,即键盘输入的内容 MOV AH,4CH INT 21HC ENDS END START4-14 试编写一程序,找出BUF数据区中带符号数的最大数和最小数,把最大数放到BH单元,把最小数放到BL单元。D SEGMENT BUF DB 5,90,-45,100,99,,-12N EQU $-BUFD ENDS STACK SEGMENT STACK DB 200 DUP(0)STACK ENDSC SEGMENT ASSUME CS:C,DS:D,SS:S START: MOV AX,D MOV DS,AX MOV CX,N-1 MOV SI,0MOV BH,BUFSIMOV BL,BUFSIAGAIN: INC SICMP BH,BUFSIJGE NEXT ;JAE NEXT错(无符号数)MOV BH,BUFSI ABC: LOOP AGAIN ;这句不要也行NEXT: CMP BL,BUFSIJLE ABCMOV BL,BUFSI LOOP AGAIN C ENDS END START 4-16 若AL中的内容为2位压缩的BCD数68H,试编程:(1)将其拆开成非压缩的BCD数,高低位分别存入BH和BL中。 (2)将上述要求的2位BCD码变换成对应的ASCII码,并且存入CH和CL中。方法1,经过调试的S SEGMENT STACK DB 10 DUP(?)S ENDSC SEGMENTASSUME CS:C,SS:S,DS:DSTAR:MOV AX,D MOV DS,AX MOV AL,68H MOV BH,AL AND AL,0FH MOV BL,AL ;(BL)是低位非压缩的BCD码 AND BH,0F0H ;(BH)将是高位非压缩的BCD码 MOV CL,4 SHR BH,CL ; (BH)是高位非压缩的BCD码 MOV CL,BL ADD CL,30H ;(CL)是低位ASCII码 MOV CH,BH ADD CH,30H ; (CH)是高位ASCII码 MOV AH,4CH INT 21HC ENDSEND STAR方法2D SEGMENTD1 DB 1,2,3D ENDSS SEGMENT STACK DB 10 DUP(?)S ENDSC SEGMENTASSUME CS:C,SS:S,DS:DSTAR:MOV AX,D MOV DS,AX MOV SI,OFFSET D1 MOV DL,68H MOV AL,68H AND AL,0FH MUL BYTE PTRSI AAM ;乘法的ASCII码调整指令,P99 MOV BL,AL MOV BH,DL AND BH,0F0H MOV CL,4 SHR BH,CL MOV AL,BH MUL BYTE PTRSI AAM MOV BH,AL MOV CL,BL ADD CL,30H MOV CH,BH ADD CH,30HC ENDSEND STAR4-18试用子程序结构编写一程序:从键盘输入一个2位十进制的月份数(0112),然后显示出相应的英文缩写名。 提示:根据题目要求实现的功能,可编写用一个主程序MAIN分别调用几个子程序。(1) INPUT从键盘接收一个2位数,并把它转换为对应的二进制数。(2) LOCATE 把输入的月份数与其英文缩写名(如JAN,FEB,MAR,APP,MAY,JUN等)对应起来,制成一个字符表以便查找。(3) DISPLAY 将找到的缩写字母在屏幕上显示出来,显示可用DOS所提供的显示功能(INT 21H的09号功能)。方法1:与方法2的不同主要在数据表的制定D SEGMENT D1 DB Please input month from the keyboad,0DH,0AH,$D2 DB 4, ?,4 DUP(?);分配键盘输入缓冲区,回车符占一个字节,但实际输入的字符数中不包含它,即输入2位数至少需预留3个字节的空间,输入完成后,实际输入的字符数为2D3 DB ERROR,0DH,0AH,$MONTH0 DB JAN,0DH,0AH,$DB FEB ,0DH,0AH,$DB MAR ,0DH,0AH,$DB APP ,0DH,0AH,$DB MAY ,0DH,0AH,$DB JUN ,0DH,0AH,$DB JUL ,0DH,0AH,$DB AUG ,0DH,0AH,$DB SEP ,0DH,0AH,$DB OCT ,0DH,0AH,$DB NOV ,0DH,0AH,$DB DEC ,0DH,0AH,$D ENDS S SEGMENT STACK DB 200 DUP(0)S ENDSC SEGMENT ASSUME CS:C,DS:D,SS:S START:CLD MOV AX,D MOV DS,AX CALL INPUTCALL LOCATECALL DISPLAYMOV AH,4CHINT 21H INPUT PROC NEARLEA DX, D1 ;将D1表示的相对地址送DXMOV AH,9INT 21H ;显示Please input month from the keyboad并换行ww2:LEA DX,D2 ;输入月份MOV AH,0AHINT 21HLEA DI,D2 ;将D2表示的相对地址送DICMP byte ptr DI+1,2 JNE ww2 ;输入的如果不是二位数,是错误MOV AH,DI+2;输入的月份高字节(十位数)MOV AL,DI+3;输入的月份低字节(个位数)XOR AX,3030H ;将ASCII码变成BCD码MOV BX,AXMOV AL,BHmov dl,0ahMUL dl ;变成二进制数MOV BH,ALMOV AL,BL ;输入的月份低字节(个位数)ADD AL,BH ;AL=1-12RET ;是必须的INPUT ENDP ;是必须的LOCATE PROC NEARDEC ALCMP AL,0CHJNC ERROR ;12(正确的情况应该是0-11),输入错误MOV BL,06HMUL BLLEA SI,MONTH0ADD SI,AXMOV DX,SI;制成一个字符表以便查找。 RETERROR:LEA DX,D3 ;将D3表示的相对地址送DX RETLOCATE ENDPDISPLAY PROC NEARMOV AH,09H;将找到的缩写字母在屏幕上显示出来INT 21HRETDISPLAY ENDPC ENDS END START方法2:数据表的制定与方法1有所不同D SEGMENT D1 DB Please input month from the keyboad,0DH,0AH,$D2 DB 4, ?,3 DUP(?) ;准备接收键盘输入,只输入2个字符,为什么必须设定最大输入字符数为3,算回车符吗?D3 DB ERROR,0DH,0AH,$MONTH1 DB 01H DB JAN,0DH,0AH,$MONTH2 DB 02H DB FEB ,0DH,0AH,$MONTH3 DB 03H DB MAR ,0DH,0AH,$MONTH4 DB 04H DB APP ,0DH,0AH,$MONTH5 DB 05H DB MAY ,0DH,0AH,$MONTH6 DB 06H DB JUN ,0DH,0AH,$MONTH7 DB 07H DB JUL ,0DH,0AH,$MONTH8 DB 08H DB AUG ,0DH,0AH,$MONTH9 DB 09H DB SEP ,0DH,0AH,$MONTH10 DB 0AH DB OCT ,0DH,0AH,$MONTH11 DB 0BH DB NOV ,0DH,0AH,$MONTH12 DB 0CH DB DEC ,0DH,0AH,$D ENDS S SEGMENT STACK DB 200 DUP(0)S ENDSC SEGMENT ASSUME CS:C,DS:D,SS:S START:CLD MOV AX,D MOV DS,AX CALL INPUT CALL LOCATE CALL DISPLAY MOV AH,4CH INT 21H INPUT PROC NEAR LEA DX, D1 ;将D1表示的相对地址送DX CALL DISPLAY ;MOV AH,9 ;INT 21H ;显示Please input month from the keyboad并换行ww2:LEA DX,D2 ;输入月份 MOV AH,0AH INT 21H LEA DI,D2 ;将D2表示的相对地址送DI CMP byte ptr DI+1,2 JNE ww2 ;输入的如果不是二位数,是错误 MOV AH,DI+2;输入的月份高字节(十位数) MOV AL,DI+3;输入的月份低字节(个位数) XOR AX,3030H ;将ASCII码变成BCD码,高位是1或0 MOV BX,AX MOV AL,BH mov dl,0ah MUL dl ;变成二进制数 MOV BH,AL MOV AL,BL ;输入的月份低字节(个位数) ADD AL,BH ;AL中为1-12 RETINPUT ENDPLOCATE PROC NEAR ;DEC AL CMP AL,0DH JNC ERROR ;13,输入错误 LEA DI,MONTH1BJ: CMP AL,DI JZ DONE ADD DI,7 JMP BJ ;MOV BL,06H ;MUL BL ;LEA SI,MONTH0 ;ADD SI,Ax ;MOV DX,SI;制成一个字符表以便查找。 ; RETDONE: INC DI MOV DX,DI ;将D3表示的相对地址送DX JMP DONE1ERROR:LEA DX,D3DONE1: RETLOCATE ENDPDISPLAY PROC NEAR MOV AH,09H;将找到的缩写字母在屏幕上显示出来 INT 21H RETDISPLAY ENDPC ENDS END START4.20 试编程:从键盘输入同学的姓名Mr.ABC或Mrs.XYZ,当按动任意一个键时,屏幕上将显示出 “Welcome Mr.ABC” 或“Welcome Mrs.XYZ”方法1,使用子程序D SEGMENTD1 DB Please input name from the keyboard,0dh,0ah,$D2 db 20,?,20 dup(?)D3 DB Welcome Mr. ABC,0DH,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年经济公司综合岗笔试题及答案
- 2025年安徽省人事人才网考试及答案
- 2025年中学行政事业编考试及答案
- 2026年跨越历史的春节与家族传承
- 2025年中南大学辅导员笔试题及答案
- 2025年柏乡教资笔试答案
- 2025年国企巡检岗笔试题库及答案
- 2026年人工智能算法工程师实战技能提升培训
- 2026年老旧小区改造政策落实情况分析
- 2025年公职编制笔试及答案
- 2024年钢丝绳索具相关项目创业计划书
- 幼小衔接数学计算每日一练39天(幼儿园大班)
- 基于蛋白代谢多组学探讨参麻益智方治疗高血压合并血管性痴呆大鼠作用机制演示稿件
- 上海布邦流体过滤产品知识课件
- 建筑施工人员三级安全教育
- 全国优质课一等奖职业学校教师信息化大赛《语文》(基础模块)《我愿意是急流》说课课件
- 初三寒假家长会ppt课件全面版
- 《干部履历表》1999版电子版
- 石泉县安沟钛磁铁矿矿山地质环境保护与土地复垦方案
- 成长作文500字五年级
- 血流动力学不稳定骨盆骨折急诊处理
评论
0/150
提交评论