|
主题 : : 实验9自己编的程序,求改进 [已解决] |
回复[ 8次 ]
点击[ 641次 ] | |
|
|
|
|
[帖 主] [ 发表时间:2013-07-25 11:42 ] | |
荣誉值:0
信誉值:2
注册日期:2011-07-19 12:12 |
自己编的,用debug可以通过,只是在编译的时候提示没有栈……
ASSUME ES:DATA,SS:STACK,CS:CODE
DATA SEGMENT
DB 'welcome to masm!'
DATA ENDS
STACK SEGMENT
DW 8 DUP (0)
STACK ENDS
CODE SEGMENT
START: MOV AX,DATA
MOV ES,AX
MOV AX,STACK
MOV SS,AX
MOV SP,16
MOV AX,0B800H
MOV DS,AX ;变量初始化
MOV AX,01110001B
PUSH AX
MOV AX,00100100B
PUSH AX
MOV AX,00000010B
PUSH AX
MOV BP,SP ;将颜色字入栈
MOV BX,0
MOV SI,0
MOV DI,0 ;寄存器初始化
MOV CX,11
S: ADD BX,160
LOOP S
MOV CX,32
S0: ADD SI,2
LOOP S0 ;初始化BX,SI
PUSH BX
MOV CX,3
S1:
PUSH SI
PUSH CX
PUSH DI ;用栈存储参数
MOV CX,16
S2: MOV AH,SS:[BP]
MOV AL,ES:[DI]
MOV DS:[BX+SI],AX
INC DI
ADD SI,2
LOOP S2
POP DI
POP CX
POP SI
ADD BP,2
ADD BX,160 ;还原参数
LOOP S1
MOV AX,4C00H
INT 21H
CODE ENDS
END START | | |
|
|
|
|
[第3楼] [ 回复时间:2013-08-07 21:38 ] | |
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25 |
自己编的。在dosbox0.74上运行结果符合题目要求。特点是:没有用栈,在数据段中设置了循环中止标识,使用jcxz指令跳出循环。
;题目:第九章实验9,在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。
;解题思路:1、用数据类型db,将'welcome to masm!'这个包括字母、字格和标点符号的16个字符存储起来;同时还存储题目所要求的3种显示形式的属性字节。
; 2、用循环将存于数据段中的字符字节与属性字节按要求写入到B8000H—BFFFFH。
assume cs:code,ds:data
data segment
db 'welcome to masm!'
db 2h,24h,71h,0h ;黑底绿字 = 0000 0010B = 2H ;绿底红色(字) 0010 0100B = 24H ;白底蓝色(字) 0111 0001B = 71H;以0h作为结束标识
data ends
code segment
start: mov ax,data ;取出数据段地址
mov ds,ax ;定义数据的段地址
sub si,si ;用于存储换行偏移量
mov ax,0B800h ;将写入内存的段地址赋予ax
mov es,ax ;定义写入数据的内存空间的段地址 ;
mov di,10h ;用于存储取出的属性字节的偏移地址,第一个属性字节偏移地址为10h
s0: mov cx,[di] ;从存储着属性字节及结束标识处取出数据
mov ax,cx ;存储取出的属性字节
jcxz ok ;判断是否取到结束标识,取到则转到ok,未取到则继续执行
mov cx,16 ;重新对cx进行赋值,以便循环执行取出和写入
sub bx,bx ;清0,bx用于存储取出字符的偏移量
sub bp,bp ;清0,bp用于存储写入字符的偏移量
s1: mov dl,[bx] ;取出字符
mov es:[bp+1984+si],dl ;写入字符,在显示缓冲区中居中
mov es:[bp+1985+si],al ;写入属性字节,在显示缓冲区中居中
inc bl ;使取出和写入字符的偏移地址自增1
add bp,2
loop s1 ;16次循环后,完成一行字符及属性字节的取出和写入
inc di ;存储属性字节的偏移地址自增1,以便在新一轮循环中写入新的属性字节
add si,160 ;在显示缓冲区换行,该区一行有160字节,三行均显示在同页
loop s0 ;转到s0处开始新一行的读写
ok: mov ax,4c00h
int 21h
code ends
end start | | |
|