一、实验要求
- 1.请独立完成作业。
- 2.请使用debug调试程序,这样不但可以查看运行结果,还能检查程序问题。
- 3.思考题需要作答。
二、实验内容
1.设置堆栈段存储数据,利用loop循环,使用单个字符输出的形式输出Hello world!
步骤要求:
- ①一种方法:设置独立的堆栈段,存储字符串Hello
world!(使用db还是dw呢?)。另一种方法:在实验9第3题基础上修改,保留数据段的数据,增加堆栈段;将数据段数据入栈。第二种方法有三个段——数据段、堆栈段和代码段。 - ②在代码段中使用loop循环,利用ah为2的系统功能调用(int 21h),将堆栈段中所有数据出栈(出栈的数据占几个字节?),当作ASCII码输出。
源程序:
stack segment
sto db 'Hello world'
num dw $-sto
stack ends
code segment
assume cs:code,ss:stack
start:
mov ax,stack
mov ss,ax
mov sp,0
mov cx,num
s:
pop ax
mov dx,ax
mov ah,2h
int 21h
mov dl,dh
mov ah,2h
int 21h
loop s
mov ax,4c00h
int 21h
code ends
end start
堆栈中存放的字符(截图):
2.设置堆栈段存储数据。在堆栈中存储十进制字型数据:48,49,50,51,52,53,54,55,56,57;使用loop循环,将这些数据分别出栈到寄存器DX中,使用INT 21H指令,将这些数据分别输出。若程序出错,请加大堆栈空间的大小。debug程序生成的exe文件。思考(不用作答):堆栈的起始物理地址是?你规划的堆栈的大小是?初始状态堆栈栈顶的物理地址是?出栈结束后,堆栈的栈顶物理地址是?代码的起始物理地址是?
源程序:
stack segment
sto dw 48,49,50,51,52,53,54,55,56,57
stack ends
code segment
assume cs:code,ss:stack
start:
mov ax,stack
mov ss,ax
mov sp,offset sto
mov cx,10
s:
pop dx
mov ah,2h
int 21h
loop s
mov ax,4c00h
int 21h
code ends
end start
堆栈中存放的字符(截图):
d ss:0
3.阅读课本187页“根据材料编程”。在dosbox下,显示三行自己的名字和籍贯拼音,每行颜色不同,第三行字体闪烁。
步骤要求:
- ①设置数据段,在数据段中存储自己名字和籍贯的拼音
- ②显示缓冲区设置为附加段
- ③第1行(可以从第2行或者第3行开始)的输出。计算本行起始偏移地址。设置好ah的值,用来控制字符颜色;使用循环——将数据段中的字符送入al,将ax送入附加段。
- ④下一行的输出。计算本行起始偏移地址。其它同③
- ⑤下一行的输出。同③和④
源程序:
data segment
str db 'chenbinbin',20h,'hunanshenghengyangshi',20h
num dw $
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax ;显示缓冲区设置为附加段
;******************************************************
mov si,0
mov di,140h ;第3行
mov cx,num
mov ah,01101101b ;高字节黄底粉红色
s1:
mov al,ds:[si] ;低字节字符ASCII码
mov es:[di],ax ;送入显示缓冲区
inc si
inc di
inc di
loop s1
;***********************************************************
mov si,0
mov di,1e0h ;第4行
mov cx,num
mov ah,01110001b ;高字节 白底蓝色
s2:
mov al,ds:[si] ;低字节字符ASCII码
mov es:[di],ax ;送入显示缓冲区
inc si
inc di
inc di
loop s2
;***********************************************************
mov si,0
mov di,280h ;第5行
mov cx,num
mov ah,11000010b ;高字节红底闪烁绿色
s3:
mov al,ds:[si] ;低字节字符ASCII码
mov es:[di],ax ;送入显示缓冲区
inc si
inc di
inc di
loop s3
;***********************************************************
mov ax,4c00h
int 21h
code ends
end start
结果(截图。截图不能显示闪烁效果):
【至此,汇编语言的实验已经结束了,以后就是计算机组成原理的实验啦~今天吃了火锅,开森!(^▽ ^)】
“人都是从一开始相信全都是真的,慢慢开始觉得全都是假的,然后发现有真有假,最后无谓真假”