1、 assume ds:data, cs:codestart: mov ax, data mov ds, ax lea dx, buff mov ah, 0ah int 21h lea dx, crlf mov ah, 9h lea si, buff + 2h 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)编程与调试心得(遇到的问题和解决的办法,以及获得
2、的收获)一开始写buff byte 255 显示error,换成buff db 255可以运行 Crlf db 0ah, 0dh, 关键在于获取字符串的长度,会存储在buff+1h中也可在末尾加$表示结尾。实验二 通过这一部分的实验,进一步熟悉汇编过程和DEBUG调试过程;掌握用汇编语言编写顺序程序。2. 写完整程序16位程序,在内存中从Table开始的10个单元中连续存放0到9的平方值,任给一个0到9的数X,该数存放在内存单元XX中,用XLAT指令查表求X的平方值,并将结果存于内存YY单元中。编写程序,并在DEBUG中进行调试和验证结果。(X,XX,YY都是内存中的变量).8086.MODE
3、L 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 INT 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位置即为res
4、ult值(通过对比一开始的存储单元得出)一开始没有注意到输入的AL是ASCII码,应当减去30H数据存储在result中可以用-d查询,学会了使用反汇编和查询存储单元通过输出是ASCII码,如9对应result的81,即51H,查表恰为Q说明存储正确(可用除10或循环移位的方法,单个数转为十进制数输出)实验三 通过本实验,熟练使用字符串的输入、读取与判断,通过实验,可以掌握循环结构的各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们彼此之间的关系。尤其是多重循环中外层循环和内层循环之间的关系。所谓回文字符串是指一个字符串正读和倒读都是一样的,例如字符串ABCD
5、EFFEDCBA就是一个回文字符串,而字符串ABCFDDCAB就不是回文字符串。现在编写完整的16位汇编程序,输入一个字符串,判断该字符串是否为回文字符串,并用“It is a palindrome”或“It is NOT a palindrome”作为输出。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
6、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,offset N mov ah,09h mov dx,offset Y INT 21H 本程序存在bug,如上图当输入abvcba时可以将abvcab与abcvba逐个字对比,发现第三个字符不同转入no段提示“It is NOT a palindrome”,而当输入确实为回文时首字母错误,原因实在是查不出来。实验四实验目的熟悉如何在数组中进行
7、查找,并返回是否成功的信息,通过实验,可以掌握循环结构的各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们彼此之间的关系。实验内容2 请编写16位完整汇编程序,在一个升序字节数组BUFF中查找数N,找到后将此数从数组中删除,并使得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;检测是否读完buf
8、f 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 ah,4chend startNC说明CF=0,查找到数N,查看存储单元由,n变为abcdefghijklm,$,n已将数组中的数n删去 运用反汇编-u得到每个指令的地址,利用-g 断点地址 快速让程序运行到特定指令位置,可以方便快捷地排查错误 进位标志CF(Carry flag) CY(1) NC(0)实验五通过本实验,掌握子程序的定义和
9、调用方法。通过程序调试,进一步理解CALL指令和RET指令的功能,掌握子程序调用时参数传递的方法。请编写完整16位汇编程序从键盘读取字符,如果是十进制的09则在屏幕上输出该数的8位二进制码,并将数字依次存放到BUF开头的数组中,如果读入的字符是Q或者q,则程序退出,其他情况在屏幕上打印“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,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
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1