《汇编语言上机实验报告(一).docx》由会员分享,可在线阅读,更多相关《汇编语言上机实验报告(一).docx(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、汇编语言上机实验报告(一)李昌健学号:U专业:应用物理学1001班时间:2013年5月16日地点:南一楼实验一在一个以BUF为首址的缓冲区中存放着字符串How are you。 请写一个程序,将该字符串倒转。倒转后的字符串放在一个新缓冲区中。 使用TD观察程序运行结束前,是否实现了上述功能。 提示:变量可用如下伪指令定义BUF DB How are youN = $ - BUF ; N为字符串的长度NEW_BUF DB N DUP(0)操作提示:使用TD.EXE调试程序时,应先单步执行各个语句,每执行一条语句,都应观察数据段中的内容以及相应寄存器的变化。二 实验要求掌握基本的程序设计框架和方法
2、、熟悉常用指令的用法、熟悉DOS功能调用、进一步掌握TD的使用方法。三 寄存器分配和变量定义说明本题利用LOOP做循环,逐一将BUF中的字节复制到NEW_BUF中。1 存储单元分配BUF: 存放初始串how are you NEW_BUF: 存放复制的字符串2寄存器分配BX: BUF 的偏移地址BP:NEW_BUF的偏移地址CX:记录循环次数SI,DI:分别用作BUF和NEW_BUF的变址寄存器AX:临时寄存器四 流程图五 源代码DATA SEGMENT BUF DB How are youN=$-BUFNEW_BUF DB N DUP(0)DATA ENDSCODE SEGMENT ASSU
3、ME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV BX,OFFSET BUFMOV BP,OFFSET NEW_BUFMOV CX,N MOV SI,CX MOV DI,0 DEC SILINE: MOV AL,BX+DI MOV DS:BP+SI,AL INC DI DEC SI LOOP LINECODE ENDS END START六 运行结果用td调试程序,可以看到在数据段里NEW_BUF已经存放了倒置的BUF.实验二一 题目假设数据段定义如下:DATA SEGMENTSTRING DB The Personal Computer & T
4、VDATA ENDS试用字串操作等指令编程完成一下功能:(1) 把该字符串传送到附加段中偏移量为GET_CHAR开始的内存单元中。(2) 比较该字符串是否与The Computer相同,若相同则将AL寄存器的内容置1,否则置0.并要求将比较次数送到BL寄存器中(3) 检查该字符串是否有&符,若有则用空格符将其替换。(4) 把字符串大写字母传送到附加段中CAPS开始的单元中,其余字符传到以CHART开始的单元中。然后将数据段中存储上述字符串的单元清零。二 实验要求掌握基本的程序设计框架和方法、熟悉常用指令的用法、熟悉DOS功能调用、进一步掌握TD的使用方法。学会熟练适用字符串操作指令。三 寄存器
5、分配和变量定义说明本题利用字符串操作指令MOVSB,CMPSB,SCASB等实现字符串的传递,比较,搜索等功能。1 变量定义说明(1) 对于第一问,数据段中STRING用于存放初始字符串,附加段中GET_CHAR用于存放复制后的字符串。(2) 对于第二问,附加段中COM用于存放待比较的字符串The Computer。(3) 对于第三问,没有用到附加段,只是用到了数据段中的初始字符串STRING。(4) 对于第四问,附加段中CAPS用于存放大写字母,CHART用于存放其他字母。2寄存器分配SI:存放源串的偏移地址。DI:存放目串的偏移地址。CX:存放循环计数值。AX,BX:临时使用的的寄存器。四
6、流程图开始(1)将STRING偏移地址赋给SI,将GET_CHAR偏移地址赋给DI,将STRING的长度赋给CX。结束利用MOVSB进行数据传递(2)结束将找到的&替换为空格利用SCASB查询是否有&将&赋给AX开始(3)结束交换BX,DI交换BX,DI利用STOS传到CAPS否是CX为0?利用STOS传到CAPS是(4)五 源代码DATA SEGMENT STRING DB The Personal Computer & TVN EQU $-STRINGDATA ENDSHELLO SEGMENT GET_CHAR DB 100 DUP(0)CAPS DB 100 DUP(0)CHART D
7、B 100 DUP(0)COM DB The ComputerCOMPARE DB 0NUMBER DB 0HELLO ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:HELLOSTART: MOV AX,DATA MOV DS,AX MOV AX,HELLO MOV ES,AX MOV CX,N LEA SI,STRING LEA DI,GET_CHAR CLD REP MOVSB MOV BL,0 MOV CX,N CMP CX,12 JNE LINEB MOV AL,1 LEA SI,STRING LEA DI,COM MOV BX,CX REPE
8、CMPSB JNE LINEA JMP LINECLINEA: MOV AL,0 SUB BX,CX JMP LINECLINEB: MOV AL,0LINEC: MOV COMPARE,AL MOV NUMBER,BL MOV AX,DATA MOV ES,AX MOV AL,& LEA DI,STRING MOV CX,N CLD REPNE SCASB JZ CHANGE JMP LINEDCHANGE: MOV BYTE PTR DS:DI-1, LINED: MOV AX,DATA MOV DS,AX LEA SI,STRING LEA DI,CAPS LEA BX,CHART MO
9、V CX,N CLDLINEF: LODSB CMP AL,41H JB LINEG CMP AL,5AH JA LINEG STOSB MOV BYTE PTR SI-1,0 JMP LINEHLINEG: XCHG BX,DI STOSB XCHG BX,DI MOV BYTE PTR SI-1,0LINEH: LOOP LINEFCODE ENDS END START六 运行结果(1) 运行后将原字符串放在了附加段偏移地址为0000的区域,如下(2) 由于两字符串长度为零,所以不相等,比较次数为零。(3) 运行后已将&替换为空格,如下(4) 运行后已将大写字母放在一起,其他字母放在另一区
10、域,如下实验三一 题目编程将AX寄存器中的内容以相反的次序传送到DX寄存器中,并要求AX中的内容不被破坏,然后统计DX寄存器中1的个数是多少。二 实验要求掌握基本的程序设计框架和方法、熟悉常用指令的用法、熟悉DOS功能调用、进一步掌握TD的使用方法。熟练掌握移位指令的使用。三 寄存器分配和变量定义说明本题先将AX中的数据循环右移,每移一位,都将移出位从DX右端移入,这样移动16次后DX便是AX的倒转的数。1 变量定义说明数据段中的PRINT,HELLO,KITTY是用来存放一些用于输出的字符串。2寄存器分配AX:用于存放原始数据DX:用于存放倒转后的数据BL:记录DX中1的个数CX:记录循环次
11、数四流程图开始对AX,CX,BL进行初始化 循环右移AX如果移出位为1,则BL加1否是结束CX=0?通过进位位循环左移DX五 源代码DATA SEGMENT PRINT DB The number of 1 in DX is :$ HELLO DB 0DH,0AH,$ KITTY DW 0DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,34H MOV CX,16 MOV BL,0LINEA: ROR AX,1 JC LINEB JMP LINECLINEB: INC BLLINEC:
12、 RCL DX,1 LOOP LINEA MOV KITTY,DX LEA DX,PRINT MOV AH,9 INT 21H MOV DL,BL ADD DL,30H MOV AH,2 INT 21H LEA DX,HELLO MOV AH,9 INT 21H MOV AX,4C00H INT 21HCODE ENDS END START六运行结果程序运行后可以看到DX中是AX的反转,如下所示并且将DX中的1的个数输出,如下图中最后一行:实验四一 题目将以BUF为首地址的字节存储区中的既能被2整除也能被7整除的无符号整数的个数(假定9)显示出来,同时对应的显示它们分别对应的地址偏移量。二 实
13、验要求掌握基本的程序设计框架和方法、熟悉常用指令的用法、熟悉DOS功能调用、进一步掌握TD的使用方法。三 寄存器分配和变量定义说明本题将0-255中能被2和7整除的数列表,对于需要检测的数,将其和该表逐一对比,可知其是否能被2和7的整除。1变量定义说明数据段中STAND用于存放0-255中能被2和7整除的数,NUMBER用于存放待检测的数。其他变量用于显示输出。2寄存器分配DI:用于存放目的串偏移地址CX:用于记录循环次数BX,DX,AX:临时使用开始四流程图否否是CX=0?检测是否与STAND中的数相同取NUMBER中待检测的数结束五 源代码DATA SEGMENT NUMBER DB 0,
14、7,14,25,72,56,70 NA EQU $-NUMBER STAND DB 0,14,28,42,56,70,84,98,112,126,140,154,168,182,196,210,224,238,252 NB EQU $-STAND PRINTA DB Number,$ PRINTB DB Address,$ PRINTC DB 0DH,0AH,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AH,9 LEA DX,PRINTB INT
15、21H LEA DX,PRINTC INT 21H MOV CX,NA MOV BX,0 MOV SI,0LINEA: MOV AL,BX LEA DI,STAND PUSH CX MOV CX,NB REPNE SCASB JZ LINEB JMP LINECLINEB: MOV AH,2 MOV DL,BL ADD DL,30H INT 21H MOV AH,9 LEA DX,PRINTC INT 21H INC SILINEC: POP CX INC BX LOOP LINEA MOV AH,9 LEA DX,PRINTA INT 21H LEA DX,PRINTC INT 21H MOV DX,SI ADD DL,30H MOV AH,2 INT 21H MOV AX,4C00H INT 21H CODE ENDS END START六 运行结果在下面给出了程序运行的结果。首先给出即可被2整除,又可被7整除的数的偏移地址,后面给出这些数的个数。上机心得:编程实在太痛苦了!
限制150内