1、 mov cl, buff + 1h next: cmp cl, 0h je finish mov dl, byte ptr si mov ah, 2h dec cl inc si jmp nextfinish: mov ah, 4chcode ends end start2)运行结果贴图3)编程与调试心得(遇到的问题和解决的办法,以及获得的收获)一开始写buff byte 255 显示error,换成buff db 255可以运行 Crlf db 0ah, 0dh, 关键在于获取字符串的长度,会存储在buff+1h中也可在末尾加$表示结尾。实验二 通过这一部分的实验,进一步熟悉汇编过程和DE
2、BUG调试过程;掌握用汇编语言编写顺序程序。2. 写完整程序16位程序,在内存中从Table开始的10个单元中连续存放0到9的平方值,任给一个0到9的数X,该数存放在内存单元XX中,用XLAT指令查表求X的平方值,并将结果存于内存YY单元中。编写程序,并在DEBUG中进行调试和验证结果。(X,XX,YY都是内存中的变量).8086.MODEL SMALL.STACK.DATA TABLE db 0,1,4,9,16,25,36,49,64,81RESULT DB ?.CODESTART:MOV AX,DATA MOV DS,AX MOV BX,offset TABLE MOV AH,01H I
3、NT 21H SUB AL,30H XLAT MOV RESULT,AL lea dx, crlf ;输出回车换行 MOV DL,RESULT MOV AH,02HEXIT:MOV AH,4CH运行debug,-u反汇编-g至001E,输入值6,查表应为36,即24H(00100100)查ASCII为$,图0076A:0030位置即为result值(通过对比一开始的存储单元得出)一开始没有注意到输入的AL是ASCII码,应当减去30H数据存储在result中可以用-d查询,学会了使用反汇编和查询存储单元通过输出是ASCII码,如9对应result的81,即51H,查表恰为Q说明存储正确(可用除
4、10或循环移位的方法,单个数转为十进制数输出)实验三 通过本实验,熟练使用字符串的输入、读取与判断,通过实验,可以掌握循环结构的各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们彼此之间的关系。尤其是多重循环中外层循环和内层循环之间的关系。所谓回文字符串是指一个字符串正读和倒读都是一样的,例如字符串ABCDEFFEDCBA就是一个回文字符串,而字符串ABCFDDCAB就不是回文字符串。现在编写完整的16位汇编程序,输入一个字符串,判断该字符串是否为回文字符串,并用“It is a palindrome”或“It is NOT a palindrome”作为输出
5、。buff db 255 db ? db 255 dup (?Y DB It is a palindrome$N DB It is NOT a palindrome$ mov ax, data mov ds, ax mov bl, buff + 1h mov bh,0h mov di,2h add di,bx mov si, 1h dec bl dec bl dec di cmp bl, 0h mov dl,buffsi mov dl,buffdi int 21h mov dl, mov al,buffsi mov cl,buffdi cmp cl,al jne no no: mov dx,o
6、ffset N mov ah,09h mov dx,offset Y INT 21H 本程序存在bug,如上图当输入abvcba时可以将abvcab与abcvba逐个字对比,发现第三个字符不同转入no段提示“It is NOT a palindrome”,而当输入确实为回文时首字母错误,原因实在是查不出来。实验四实验目的熟悉如何在数组中进行查找,并返回是否成功的信息,通过实验,可以掌握循环结构的各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们彼此之间的关系。实验内容2 请编写16位完整汇编程序,在一个升序字节数组BUFF中查找数N,找到后将此数从数组中删除,
7、并使得CF=0;没找到返回CF1。.model small.databuff db abcdefghijklmn,$N db n.code mov dx,data mov ds,dx mov al,N mov,ah, lea di,bufffinding:inc di cmp al,di jz yes cmp ah,di;检测是否读完buff jz no jmp findingyes:add ah,0 mov si,disetarray: jz exit mov cl,si mov di,cl inc di jmp setarraymov ah,0 cmp ah,1;设置cfexit:mov
8、ah,4chend startNC说明CF=0,查找到数N,查看存储单元由,n变为abcdefghijklm,$,n已将数组中的数n删去 运用反汇编-u得到每个指令的地址,利用-g 断点地址 快速让程序运行到特定指令位置,可以方便快捷地排查错误 进位标志CF(Carry flag) CY(1) NC(0)实验五通过本实验,掌握子程序的定义和调用方法。通过程序调试,进一步理解CALL指令和RET指令的功能,掌握子程序调用时参数传递的方法。请编写完整16位汇编程序从键盘读取字符,如果是十进制的09则在屏幕上输出该数的8位二进制码,并将数字依次存放到BUF开头的数组中,如果读入的字符是Q或者q,则程
9、序退出,其他情况在屏幕上打印“You must input 09, or q or Q”。(如输入的字符是9,则输出“00001001”).提示:输出一个数的2进制形式应该从最高位开始输出。要求打印一个数的2进制形式和输出回车换行分别定义成一个子程序可以将此段程序定义成一个过程。.stackSTR db you must input 09 or q,QLFCR PROC PUSH AX MOV AH,02 MOV DL,0AH POP AX RETLFCR ENDPPRINT PROC JL T CMP AL,9 JG T MOV CX,8LP:MOV DL,0 SHL AL,1 ADC DL
10、,30H LOOP LP JMP RT:LEA DX,STR MOV AH,09HR:PRINT ENDP MOV CX,-1L: CMP AL,Q JZ exitq CALL LFCR CALL PRINT POP CX DEC CX PUSH CX JNZ L输入的AH是ASCII码SUB AL,30H使的转换为数字运用子程序调用可以使主程序看起来更加简洁明了,且易于调试,维护LFCR回车换行需注意将ax压栈,以便调用int 21h的输出功能Crlf db 0ah, 0dh, 即为回车换行实验六Programming a sub routine to calculate N!. Speci
11、fic requirements:Read a number N(16) from keyboard,programming a sub routine named DAC to calcute N!, then print the result to screen in decimal form.NUMBER DB ?STR db 0AH,0DH,you must input 16OUTPUT DB 20H,4 DUP(20H), MOV BX,10 MOV SI,4 L: IDIV BX ADD DX,30H MOV OUTPUTSI,DL MOV DX,0 DEC SI CMP SI,0
12、JG L CHECK0: INC SI CMP OUTPUTSI,30H JNZ RIGHT MOV OUTPUTSI, CMP SI,4 JL CHECK0 RIGHT:LEA DX,OUTPUTMOV AH,9INT 21HRET LEA DX,NUMBER JBE exit CMP AL,07H JAE EXIT MOV CL,AL MOV CH,0H MOV AX,1IMUL CX LOOPNZ LPMOV AH,09H一开始输出的十进制数带0,如0720,0002等,后检测为0即赋值20H(空格),发现6!=72,不仅去掉了开头的0,也去掉了末尾的0,将NUMBER由+1至+4检查,
13、遇到非0的数就退出检测可以解决。实验七在附加段中有一个从小到大排序的无符号数字数组,其首地址在DI中,数组的第一个单元存放数组长度。要求用折半查找法在数组中查找数N,假设该数已在AX中,如找到,CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,CF=1。TABLE db 1,4,7,9,16,31,36,49n DB 1r db 7l db 0 MOV di,offset TABLE mov bl,n mov cl,2check: MOV al,r cmp al,l add al,l mov ah,0 div cl mov ah,0 add si,ax cmp si,bl jl ri
14、ght mov r,al jmp check right:mov l,aljmp check sub ah,1 jmp exit cmp ax,0查找数字n=1(BX),得数组中序号0,即Table0(AX)=1满足搜索条件,使CF=0(NC),并 用mov si,di add si,ax使得si获得Table0(AX)的偏移地址。 一开始div cl 时忘记将AH设置成0,结果一直循环DIV C; ,SI+BI,IRETMOV AH,0后恢复正常 实验八在内存中有一个数组,里面是放着10个学生的某科的成绩,分别是:85,73,92,66,91,98,52,87,83,68, 请用冒泡排序法将
15、这10个数从大到小排序,并将排序的结果在屏幕上打印出来,要求一个数一行的格式输出。n equ 10 BUFFER DB 85,73,92,66,91,98,52,87,83,68 MOV BL,10 MOV SI,0 mov al, BUFFERsi IDIV BL MOV CX,AX MOV Dl,CL ADD DL,30H MOV Dl,CH LEA DX,CRLFINC SICMP SI,10JL L mov cx,n dec cx loop1: mov di,cx mov bx,0 loop2: mov al,bufferbx cmp al,bufferbx+1 jge continue xchg al,bufferbx+1 mov bufferbx,al continue: add bx,1 loop loop2 mov cx,di loop loop1 call PRINTmov ah, 4ch ;程序结束,返回到操作系统系统 int 21h END start即可实现换行注意输出字符时需转换成ASCII以便输出,idiv 10,先输出商再输出余数
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1