|
主题 : : 实验9自己编的程序,求改进 [已解决] |
回复[ 8次 ]
点击[ 638次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2013-07-25 11:42 ]
[引用]
[回复]
[ top ] | |
荣誉值: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 | | |
|
|
|
|
[第1楼]
[ 回复时间:2013-07-31 20:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-07-19 12:12 |
|
|
|
|
|
[第2楼]
[ 回复时间:2013-08-07 21:28 ]
[引用]
[回复]
[ top ] | |
荣誉值: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 ;写入字符,在显示缓冲区中居中,一页25行(居中则25/2取整,等于12),一行160字节,故(160*12)+(160/2-32/2)=1984
mov es:[bp+1985+si],al ;写入属性字节,在显示缓冲区中居中,一页25行(居中则25/2取整,等于12),一行160字节,故(160*12)+(160/2-32/2)+1=1985
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 | | |
|
|
|
|
[第3楼]
[ 回复时间:2013-08-07 21:38 ]
[引用]
[回复]
[ top ] | |
荣誉值: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 | | |
|
|
|
|
[第4楼]
[ 回复时间:2013-08-08 09:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25 |
实验9的自我更正:
在一页共25行的屏幕上输出3行居中的彩色字符串'welcome to masm!'。它们在屏幕中的位置应为第12行、13行和14行。当第1个彩色字符在第12行居中时,其前11行字节数为6ech,本行前面还有40h个字节数。由此,第1个字母在720h处,第1个属性字节在721h处。因此,
mov es:[bp+1984+si],dl
mov es:[bp+1985+si],al
应改为:
mov es:[bp+720h+si],dl
mov es:[bp+721h+si],al | | |
|
|
|
|
[第5楼]
[ 回复时间:2014-09-12 18:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2014-09-04 18:42 |
|
|
|
|
|
[第6楼]
[ 回复时间:2014-09-13 00:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2014-08-02 21:25 |
3楼的程序编译,链接,执行正确。
5楼要问什么啊? | | |
|
|
|
|
[第7楼]
[ 回复时间:2014-11-01 13:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2014-07-16 21:39 |
|
|
|
|
|
[第8楼]
[ 回复时间:2015-02-13 16:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-07-19 12:12 |
此贴由 贴主 于 [ 2015-02-13 16:56 ] 结贴。 结贴原因:问题已解决 | | |
|