实验一 DEBUG命令实验
一.实验目的:
掌握DEBUG 的基本命令及其功能
二.实验内容:
DEBUG是专门为汇编语言
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
的一种调试工具,它通过步进,设置断点等方式为汇编语言程序员提供了非常有效的调试手段。
1、DEBUG的主要命令
(1) 汇编命令A,格式为:-A[地址];
该命令从指定地址开始允许输入汇编语句,把它们汇编成机器代码相继存放在从指定地址开始的存储器中。
例如:
-a
136B:0100 mov ax,100
136B:0103 mov bx,200
136B:0106 mov cx,300136B:0109 mov dx,400
136B:010C
-
(2) 反汇编命令U,有两种格式:
1)-U[地址]
该命令从指定地址开始,反汇编32个字节,若地址省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。
例如:
-u
2)-U范围
该命令对指定范围的内存单元进行反汇编,
例如:
(3) 运行命令G,格式为:
-G [=地址1][地址2[地址3。。。]]
其中地址1规定了运行起始地址,后面的若干地址均为断点地址。
例如:
(4) 追踪命令T,有两种格式:
1)逐条指令追踪:-T[=地址];该命令从指定地址起执行一条指令后停下来,显示寄存器内容和状态值。
2)多条指令追踪:-T[=地址][值],该命令从指定地址起执行n条命令后停下来,n由[值]确定。
(5) 显示内存单元内容的命令D,格式为:-D[地址]或-D[范围]
(6) 修改内存单元内容的命令E,它有两种格式:
1)用给定的内容代替指定范围的单元内容:-E地址 内容
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
例如:-E 2000:0100 F3 “XYZ” 8D
其中F3,“X”“Y”“Z”和8D各占一个字节,用这五个字节代替原内存单元049e:0005到0008的内容,“X”“Y”“Z”将分别按它们的ASCII码值代入。
2)逐个单元相继地修改:-E地址
例如:
此命令是将原5号单元的内容f3改为89>89是程序员键入的。
(7) 检查和修改寄存器内容的命令R,它有三种方式:
1)显示CPU内部所有寄存器内容和标志位状态;格式为:-R
R命令显示中标志位状态的含义如下表所示:
标 志 名
置 位
复 位
溢出Overflow(是/否)
OV
NV
方向Direction(减量/增量)
DN
UP
中断Interrupt(允许/屏蔽)
EI
DI
符号Sign(负/正)
NG
PL
零Zero(是/否)
ZR
NZ
辅助进位Auxiliary Carry(是/否)
AC
NA
奇偶Parity(偶/奇)
PE
PO
进位Carry(是/否)
CY
NC
2)显示和修改某个指定寄存器内容,格式为:
-R 寄存器名
例如打入:-R AX
表示AX当前内容为F1F4,此时若不对其作修改,可按ENTER键,否则,打入修改后内容,如:
-R BX
BX 0369
:059F
则BX内容由0369改为059F
3)显示和修改标志位状态,命令格式为:
-RF
系统将给出响应,如
OV DN EI NG ZR AC PE CY-
这时若不作修改可按ENTER键,否则在“-”号之后键入修改值,键入顺序任意。如
OV DN EI NG ZR AC PE CY-PONZDINV
三 、实验任务
1. 参照附录1,掌握DEBUG程序的各种命令,重点是命令R,D ,A,U,T,P,G命令的使用。
2. 用命令A汇编下列指令,判断指令正误并说明原因。
(1) ROR AX,8
(2) LEA DI,[AX]
(3) MOV DS,2010
(4) PUSH AL
(5) OUT 900,AL
(6) MOV [BX],0
3. 用命令查看8086/8088 CPU在开机后执行的第一条指令。
4. 用命令D查看DS:200~22F和F000:200~22F两内存块内容,用命令F将字符“A”分别填入这两个内存块,比较填入前后结果,了解可读写内存RAM和只读内存ROM的区别。
5. 用A命令汇编一条INT 1C指令,用命令T单步执行该指令,比较指令执行前后CS和IP、堆栈指针SP及堆栈内容变化情况,了解什么是中断向量表,中断向量和中断子程,掌握中断指令的执行过程。
6. 利用T,P,G命令,执行下列指令段,注意它们的不同之处。
(1) MOV DI,300
MOV SI,400
MOV CX,3
CLD
REP MOVSB
INT 3
(2) MOV AH,2
MOV DL,41
INT 21
INT 3
(3) 先在CS:200处汇编一条RET指令,再在CS:100处汇编。
MOV BX,200
CALL BX
INT 3
然后从MOV BX,200处开始执行。
实验三 分支程序实验
一、实验目的
1)掌握分支程序的设计方法。
2)掌握利用DEBUG修改参数、检查结果的方法。
3)掌握汇编语言源程序的编辑、汇编、连接及调试过程。
二、实验内容
1)编写一个程序,显示AL寄存器中的两位十六进制数
2)编写一个程序,判别键盘上输入的字符;若是0-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符
(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。
1)显示AL中两位十六进制数程序:
;DISPHEX.ASM
CODE SEGMENT
ASSUME CS:CODE
START: MOV AL,3EH 0011 1110
MOV BL,AL
MOV DL,AL
MOV CL,4
SHR DL,CL 逻辑右移4位,dl= 0000 0011
CMP DL,9 比较
JBE NEXT1 小于等于
ADD DL,7
NEXT1: ADD DL,30H 0000 0011+0011 0000 dl=33h
MOV AH,2 ah=0000 0010
INT 21H ;显示高位ASCII码
MOV DL,BL
AND DL,0FH 0eh
CMP DL,9
JBE NEXT2
ADD DL,7
NEXT2: ADD DL,30H
MOV AH,2
INT 21H ;显示低位ASCII码
MOV AH,4CH
INT 21H
CODE ENDS ;返回DOS
END START
2)显示键入字符程序
;DISPKEY.ASM
CODE SEGMENT
ASSUME CS:CODE
START: MOV AH,1 ;1号功能调用
INT 21H ;等待键入字符,送AL
CMP AL,0DH ;是否是回车符?
JZ DONE ;是则转DONE退出程序
CMP AL,’0’
JA NEXT
CMP AL,’9’
JB CHARUP
MOV DL,AL
MOV AH,2
INT 21H ;显示0~9
JMP START
CHARUP: CMP AL,41H
JA NEXT
CMP AL,5AH
JB CHRDN
DISPC: MOV DL,’C’
MOV AH,2
INT 21H
NEXT: JMP START
CHRDN: CMP AL,61H
JB NEXT
CMP AL,7AH
JA NEXT
JMP DISPC
DONE: MOV AH,4CH
INT 21H ;返回DOS
CODE: ENDS
END START
首先运行程序:
对程序进行但不执行,了解程序的运行过程:
程序流图:
实验四 循环程序实验
一、实验目的:
1)掌握循环程序的设计方法
2)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。
3)学会针对不同的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
,选用不同的组织循环的方法。
二、实验内容
1)将字符串STRN(以“$”结尾)中的每一个字符均加上偶校验位,并统计有多少个字符因含有奇数个“1”而加上了校验位。统计结果存于N单元中。
2)存储单元DAT1及DAT2中各有10字节的二进制数,高位字节放在高位地址中。试编写一程序将这两个数据相加,结果存放在从DAT3开始的单元中。
1)偶校验程序清单:
;EX56.ASM
DESG SEGMENT
STRN DB ‘ASCDEfghijkLMNOPQuvw’,‘$’
N DB ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
START: MOV AX, DSEG
MOV DS, AX
LEA SI, STRN
MOV DL, 0
AGAIN: MOV AL, [SI]
CMP AL, ‘$’
JE DONE
TEST AL, 0FFH
JPE NEXT
OR AL, 80H
MOV [SI], AL
INC DL
NEXT: INC SI
JMP AGAIN
DONE: MOV N, DL
MOV AH, 4CH
INT 21H
CSEG ENDS
END START
;以上是条件控制的循环。因为事先不知道字符串STRN共有多少字符,故采用条件控制的循环程序实现。
可以看出,有十个字符进行了偶校验
2)加法程序清单:
;ADDHEX.ASM
CODE SEGMENT
ASSUME CS: CSEG, DS: DSEG
START: MOV AX, CS
MOV DS, AX
LEA SI, DAT1
LEA DI, DAT2
LEA BX, DAT3
MOV CX, 10
XOR AL, AL ;0→CF
AGAIN: MOV AL, [SI]
ADC AL, [DI]
MOV [BX], AL
INC SI
INC DI
INC BX
LOOP AGAIN
MOV AH, 4CH
INT 21H
DAT1 DB 70H, 80H, 90H, A0H, A1H, A2H, A3H
DB 74H, 65H, 56H
DAT2 DB 45H, 67H, 89H, 1AH, 2BH, 3CH
DB 4DH, 5EH, 6FH, 04H
DAT3 DB 10 DUP(?)
CODE ENDS
END START ;本程序中,DS及CS同处一个逻辑段CODE中,所以,应将CS值送至DS中。
相当于计算
实验五 子程序实验(1)
一、实验目的
1)掌握主程序与子程序之间的调用关系及调用方法。
2)掌握子程序调用过程中近程调用与远程调用的区别。
3)掌握通过堆栈转送参数的方法。
二、实验内容
1)将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。在转换过程中,通过子程序DISP实现显示。
2)编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
1)码型转换程序清单:
;CONV.ASM
DATA SEGMENT
BUF DB 0ABH,0CDH,0DEH,01H,02H,03H
DB 3AH,4BH,5CH,6FH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,10
LEA BX,BUF
AGAIN: MOV AL, [BX]
CALL HEXASC
INC BX
LOOP AGAIN
MOV AH,4CH
INT 21H
HEXASC PROC NEAR
MOV DL,AL
PUSH CX
MOV CL,4
SHR DL,CL
POP CX
CALL DISP ;显示高位HEX数
MOV DL,AL
AND DL,0FH
CALL DISP ;显示低位HEX数
RET
HEXASC ENDP
DISP PROP
CMP DL,9
JBE NEXT
ADD DL,7
NEXT: ADD DL,30H ;将一位HEX数转为ASCII码
MOV AH,2
INT 21H ;显示
RET
DISP ENDP
CODE ENDS
END START
2)统计并显示某键入字符的个数的程序:
:COUNTER.ASM
DATA SEGMENT
CHAR DB ‘b’
BUF DB 50H, ? 50H DUP(?)
DATA ENDS
MCODE SEGMENT
ASSUME CS: MCODE, DS: DATA
START: MOV AX,DATA
MOV DS,AX
LEA DX,BUF
MOV AH,9
INT 21H
LEA SI BUF
MOV CL, [SI+1]
MOV CH, 0 ;CX中为字符串长度
INC SI
INC SI ;SI指向串首址TABLE
MOV AL,CHAR
MOV AH,0 ;AX中为待查字符
PUSH SI
PUSH CX
PUSH AX ; 参数送堆栈
CALL CHECK
POP AX ;统计个数在AL中
MOV DL,CHAR
MOV AH,2
INT 21H ;显示待检字符
MOV DL,AL
AND DL, 0FH
CMP DL,9
JBE NEXT
ADD DL,7
NEXT: ADD DL,30H
MOV AH,2
INT 21H ;显示统计个数
MOV AH,4CH
INT 21H
MCODE ENDS
SCODE SEGMENT
ASSUME CS:SCODE
CHECK PROC FAR
PUSH BP
MOV BP,SP
MOV SI,[BP+10]
MOV CX,[BP+8]
MOV AX,[BP+6]
XOR AH,AH
AGAIN: CMP AL,[SI]
JNE NEXT1
INC AH
NEXT1: INC SI
LOOP AGAIN
MOV AL,AH
MOV [BP+10],AX
POP BP
RET .4
CHECK ENDP
END START
实验六 子程序实验(2)
本实验目的在于使读者掌握模块间调用子程序的编写方法。
一、实验目的
(1)了解多模块程序设计方法。
(2)学会使用PUBLIC和EXTRN伪指令解决模块间的符号(如变量名、标号等)通信题。
二、实验内容
(1)编写一个子程序,将主程序敲定的内存中字符串的小宝字母转换成大写字母并显示出来。主程序用另一个模块编写。
(2)编写一个子程序,将主程序指定的字符所在的地址值返回给主程序,字符串与主程序在同一个模块。
(1)转换字符串小写字母为大写字母的程序清单:
;EXCHAR.ASM 为主模块的文件名
EXTRN DNTOUP: FAR
PUBLIC STRING1, STRING2
DATA SEGMENT
STRING1 DB 'This is a Book','$'
STRING2 DB 80 DUP (?)
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
CALL DNTOUP
MOV AH, 4CH
INT 21H
CODE ENDS
END START
;DNTOUP.ASM为子模块的文件名
PUBLIC DNTOUP
EXTRN STRING1: BYTE, STRING2: BYTE
CODE SEGMENT
ASSUME CS: CODE
DNTOUP PROC FAR
MOV BX,0
CYCLE: MOV AL, STRING1 [BX]
CMP AL,24H ;是否是STRING1结尾
JZ DONE ;是“$”,转DONE
CMP AL,61H ;是否是小写字母
JB NEXT ;不是转NEXT
CMP AL, 7AH
JA NEXT
SUB AL,20H ;转为大写字母
NEXT: MOV STRING2 [BX],AL
INC BX
JMP CYCLE
DONE: MOV AL,'$'
MOV STRING2[BX],AL ;补一个$
MOV DL, 0DH
MOV AH, 2
INT 21H
MOV DL, 0AH
MOV AH, 2
INT 21H ;显示回车。换行
LEA DX, STRING1
MOV AH, 9
INT 21H ;显示源串内容
MOV DL, 0DH
MOV AH, 2
INT 21H
MOV DL, 0AH
MOV AH, 2
INT 21H ;回车换行
MOV DX, OFFSET STRING2
MOV AH,9
INT 21H ;显示转换后的大写串
RET
DNTOUP ENDP
CODE ENDS
END
(2)查找指定字符,并返回地址值的程序清单:
;MAINP.ASM为主模块程序名
EXTRN FINDC: FAR
PUBLIC STRN
DATA SEGMENT
STRN DB 'LINK DISPLAY SUBROUNTINE $'
ADDR DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
MOV AH, 1
INT 21H
CALL FINDC
MOV ADDR, DI
MOV AH, 4H
INT 21H
CODE ENDS
END START
;FINDC.ASM为子模块程序名
PUBLIC FINDC
EXTRN STRN:BYTE
CODE SEGMENT
LEA DI, STRN
AGAIN: CMP BYTE PRT [DI],'$'
JZ DONE
CMP AL, [DI]
JNZ NEXT
DONE1: RET
NEXT: INC DI
JMP AGAIN
DONE: MOV DI, 0FFFFH ;找不到返回0FFFFH
JMP DONE1
FINDC ENDP
CODE ENDS
END
得不到返回的地址值,修改主程序;
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov ah,1
int 21h
call findc
mov adddr,di ;改名
mov dl,0ah ;显示回车
mov ah,2
int 21h
mov dl,0dh
int 21h
mov dx,di
mov ch,4 ;显示4位
mov cl,4
lop: rol dx,cl
push dx
and dl,0fh
cmp dl,9
jbe skip
add dl,7
skip: add dl,30h
int 21h
pop dx
dec ch
jnz lop
mov dl, ‘h’ ;显示h
int 21h
mov ah,4ch
int 21h
code ends
end start
(3)若由键盘输入字符串,则可在程序1的主模块的DATA段中加一行提示信息IMAGE:
IMAGE DB ’INPUT A STRING PLEASE:$’
然后在主模块的CALL指令前插入以下程序段:
LEA DX, IMAGE
MOV AH,9
INT 21H
LEA DX,STRING2+1
MOV AH,0AH
INT 21H ;将键入串存入STRING2
LEA SI,STRING2+2
MOV CL,STRING2+1
MOV CH,0
LEA DI,STRING1
AGAIN MOV AL , [SI]
MOV [DI],AL
INC SI
INC DI
LOOP AGAIN
MOV BYTE PTR[DI],'$' ;补一个$
说明:此处先将键入存入STRING2,然后再将其部分传送到STRING1中。当然
在定义STRING2时,应为:STRING2 DB 80,? 80DUP(?)。