DATAS SEGMENT DATAS ENDS
STACKS SEGMENT STACKS ENDS CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AX,3000H MOV BX,5000H PUSH AX MOV AX,BX POP BX
MOV AH,4CH
INT 21H CODES ENDS END START
在debug 中进行调试,逐步执行结果:
第二个程序清单: DATAS SEGMENT DATAS ENDS CODES SEGMENT
ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV BX,0300h MOV SI,0002h MOV AH,4CH INT 21H CODES ENDS END START
在debug中进行调试,逐步执行结果:
实验三、存储器块清零和内存块移动
一、 程序说明:
第一个程序是存储块清零。程序流程大概为首先设置起始地址,然后设置块长度,然后将当前地址内容清零,地址加1,然后查看是否清除完全,若没有则回到当前地址清零,然后再查看,直到地址内容清除完,结束程序。
第二个程序是内存块移动。程序流程框图为:首先设置块的源地址,然后设置筷的目的地址,然后再设置移动长度,然后按长度重复传送数据,然后结束。 二、 调试说明:
第一个程序在进入debug后,先用-u指令查看一下程序,再将断点设置在指令Loop again之后,通过指令-g加上指令Loop again后的地址,将程序运行到Loop again之后停止,然后再通过-d指令查看相关内存内容是否被清零。 第二个程序在进入到debug后,先用-u指令查看一下程序,再将断点设置在指令rep movsb之前,通过指令-g运行后,然后用-d指令查看一下内存块的相关内容,得到的结果如下:
三:源程序代码和执行结果:
实验一: data segment
block db 256 dup(55h) data ends
code segment
assume cs :code ,ds:data start proc near mov ax,data mov ds ,ax
mov bx,offset block mov cx,256 again:
mov [bx],byte ptr 0 inc bx
loop again jmp $
code ends end start
实验二: 源代码:
地址块加一方法移动块的源程序: DATAS SEGMENT
SOURCE DB 256 DUP(055H) TARGET DB 256 DUP(0AAH) DATAS ENDS
STACKS SEGMENT STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV ES,AX
MOV SI,OFFSET SOURCE
MOV DI,OFFSET TARGET MOV CX,256 REP MOVSB MOV AH,4CH INT 21H CODES ENDS END START
第二部分地址块减一方法移动块的源程序: DATAS SEGMENT
SOURCE DB 256 DUP(055H) T ARGET DB 256 DUP(0AAH) DATAS ENDS
STACKS SEGMENT STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV ES,AX
MOV SI,OFFSET SOURCE ADD SI,255
MOV DI,OFFSET TARGET MOV CX,256
NEXT:MOV AL,[SI] MOV [DI],AL DEC SI INC DI LOOP NEXT MOV AH,0 MOV AH,4CH INT 21H
CODES ENDS END START 执行结果:
实验四 将键盘输入的小写字母用大写字母显示出来
一、 程序说明
本程序用来将小写字母转变为大写,并在屏幕上显示出来。先利用DOS功能调用INT21H的1号功能从键盘输入字符,然后判断输入的是否是小写字母,若不是小写字母,则显示输入出错,重新输入。若输入的是小写字母,则通过将其减去20h,从而变为大写字母。在通过DOS功能调用INT21H的2号功能显示出来。若输入的是Enter键,则结束程序。 二、 调试说明