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