logo资料库

东南大学io 汇编部分实验.docx

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
IO 汇编实验部分 实验一 一)实验目的 学会安装“16 位汇编程序开发软件”的安装,完成将汇编语言源程序录入进计算机、 利用 ml.exe 进行汇编,LINK 进行链接,并用 DEBUG 调试 16 位程序的全部过程。本实验 大家不必了解程序细节,只是为了熟悉开发环境和上机过程。 二)实验内容 3. 写 16 位汇编程序,从键盘输入一个字符串,然后换行后将该字符串输出到屏幕。 1)源程序 data segment buff DB 255 DB ? DB 255 dup (?) crlf db 0ah, 0dh, "$" data ends code segment assume ds:data, cs:code start: mov ax, data mov ds, ax ;回车换行 lea dx, buff mov ah, 0ah int 21h lea dx, crlf mov ah, 9h int 21h lea si, buff + 2h mov cl, buff + 1h next: cmp cl, 0h je finish mov dl, byte ptr [si] mov ah, 2h int 21h
dec cl inc si jmp next finish: mov ah, 4ch int 21h code ends end start 2)运行结果贴图 3)编程与调试心得(遇到的问题和解决的办法,以及获得的收获) 一开始写 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 都是内存中的变量) 1)源程序 .8086 .MODEL SMALL .STACK .DATA TABLE db 0,1,4,9,16,25,36,49,64,81 RESULT DB crlf db 0ah, 0dh, "$" .CODE START: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 ah, 9h int 21h MOV DL,RESULT MOV AH,02H INT 21H EXIT:MOV AH,4CH INT 21H end start 2)运行结果贴图 运行 debug,-u 反汇编-g 至 001E,输入值 6,查表应为 36,即 24H(00100100) 查 ASCII 为$,图 0076A:0030 位置即为 result 值(通过对比一开始的存储单元得出)
3)编程与调试心得(遇到的问题和解决的办法,以及获得的收获) 一开始没有注意到输入的 AL 是 ASCII 码,应当减去 30H 数据存储在 result 中可以用-d 查询,学会了使用反汇编和查询存储单元 通过输出是 ASCII 码,如 9 对应 result 的 81,即 51H,查表恰为 Q 说明存储正确(可用除 10 或循环移位的方法,单个数转为十进制数输出) 实验三 一)实验目的 通过本实验,熟练使用字符串的输入、读取与判断,通过实验,可以掌握循环结构的 各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及 他们彼此之间的关系。尤其是多重循环中外层循环和内层循环之间的关系。 二)实验内容 所谓回文字符串是指一个字符串正读和倒读都是一样的,例如字符串‘ABCDEFFEDCBA’ 就是一个回文字符串,而字符串‘ABCFDDCAB’就不是回文字符串。现在编写完整的 16 位汇编程序,输入一个字符串,判断该字符串是否为回文字符串,并用“It is a palindrome” 或“It is NOT a palindrome”作为输出。 1)源程序 data segment buff db 255 db ? db 255 dup (?) crlf db 0ah, 0dh, "$" Y DB "It is a palindrome$" N DB "It is NOT a palindrome$" data ends ;回车换行 code segment assume ds:data, cs:code start: mov ax, data mov ds, ax
lea dx, buff mov ah, 0ah int 21h lea dx, crlf mov ah, 9h int 21h bl, buff + 1h mov mov bh,0h mov di,2h add di,bx mov si, 1h dec bl next: dec bl dec di inc si cmp bl, 0h je finish mov dl,buff[si] mov ah, 2h int 21h mov dl,buff[di] mov ah, 2h int 21h mov dl," " mov ah, 2h int 21h mov al,buff[si] mov cl,buff[di] cmp cl,al jne no jmp next lea dx, crlf no: mov ah, 9h int 21h
mov dx,offset N mov ah,09h INT 21H mov int 21h ah, 4ch dx, crlf finish: lea mov ah, 9h int 21h mov dx,offset Y mov ah,09h INT 21H mov ah, 4ch int 21h code ends end start 2)运行结果贴图 3)编程与调试心得(遇到的问题和解决的办法,以及获得的收获) 本程序存在 bug,如上图当输入 abvcba 时可以将 abvcab 与 abcvba 逐个字对比,发现第三个 字符不同转入 no 段提示“It is NOT a palindrome”,而当输入确实为回文时首字母错误,原 因实在是查不出来。 实验四 实验目的 熟悉如何在数组中进行查找,并返回是否成功的信息,通过实验,可以掌握循环结构的各种 实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们 彼此之间的关系。尤其是多重循环中外层循环和内层循环之间的关系。 实验内容
2 请编写 16 位完整汇编程序,在一个升序字节数组 BUFF 中查找数 N,找到后将此数从 数组中删除,并使得 CF=0;没找到返回 CF=1。 1)源程序 .8086 .model small .data buff db 'abcdefghijklmn','$' N db 'n' .code start: mov dx,@data mov ds,dx mov al,N mov,ah,'$' lea di,buff dec di finding:inc di cmp al,[di] jz yes cmp ah,[di];检测是否读完 buff jz no jmp finding yes:add ah,0 mov si,di inc si setarray: cmp ah,[di];检测是否读完 buff jz exit mov cl,[si] mov [di],cl inc di inc si jmp setarray no:mov ah,0 cmp ah,1;设置 cf exit:mov ah,4ch int 21h end start 2)运行结果贴图
NC 说明 CF=0,查找到数 N,查看存储单元由'abcdefghijklmn','$',‘n’变 为’abcdefghijklm’,’$’,’n’已将数组中的数 n 删去 3)编程与调试心得(遇到的问题和解决的办法,以及获得的收获) 运用反汇编-u 得到每个指令的地址,利用-g 断点地址 快速让程序运行到特定指令位置, 可以方便快捷地排查错误 进位标志 CF(Carry flag) CY(1) NC(0) 实验五 实验目的 通过本实验,掌握子程序的定义和调用方法。通过程序调试,进一步理解 CALL 指令 和 RET 指令的功能,掌握子程序调用时参数传递的方法。 实验内容 请编写完整 16 位汇编程序从键盘读取字符,如果是十进制的‘0’~‘9’则在屏幕上输出 该数的 8 位二进制码,并将数字依次存放到 BUF 开头的数组中,如果读入的字符是’Q’或者 ‘q’,则程序退出,其他情况在屏幕上打印“You must input 0~9, or ‘q’ or ‘Q’”。(如输入 的字符是‘9’,则输出“00001001”).提示:输出一个数的 2 进制形式应该从最高位开始 输出。要求打印一个数的 2 进制形式和输出回车换行分别定义成一个子程序可以将此段程序 定义成一个过程。 1)源程序 .8086 .model small .stack .data STR db 'you must input 0~9 or q,Q','$' .code LFCR PROC PUSH AX
分享到:
收藏