|
主题 : : 实验9, 简单的设计! [待解决] |
回复[ 14次 ]
点击[ 898次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-10-15 10:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:8
注册日期:2008-09-15 09:10 |
assume cs:code ,ds:data
data segment
db 'welcome to masm!'
db 02h,24h,71h ;三种显示属性
data ends
code segment
start:mov ax,data
mov ds,ax
mov si,16
mov ax,0B800H ;定位到屏幕中间
mov es,ax
mov bp,7C0H
mov cx,3
s0:mov ax,cx
mov bx,0
mov dh,ds:[si]
mov cx,16
s: mov dl,[bx]
mov es:[bp],dl
mov byte ptr es:[bp+1],dh
inc bx
add bp,2
loop s
add bp,128
inc si
mov cx,ax
loop s0
mov ax,4c00h
int 21h
code ends
end start
请问高手,没有没用别的方法实现的,贴出来参考! | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-10-15 10:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34 |
这个题的思路不太复杂,楼主的思路不错,循环嵌套节省了好几行代码。
小细节也可以自己考虑下,比如保存cx用栈是不是更合适,更利于扩展。
可不可以用mov es:[..],dx代替上面的两条指令等等 | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-10-15 11:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:8
注册日期:2008-09-15 09:10 |
回第1楼:
你这个问题提的很好,用栈当然就利于扩展了!
但就对这个程序而言,若用栈就会用许多内存。
‘可不可以用mov es:[..],dx代替上面的两条指令等等‘
你这个我没有看明白 | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-10-15 11:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:8
注册日期:2008-09-15 09:10 |
针对上面的程序我又想了一种用本章才学的jcxz指令的设计
assume cs:code ,ds:data
data segment
db 'welcome to masm!'
db 02h,24h,71h ;显示属性
dw 0,0,1 ;控制jcxz跳转
data ends
code segment
start:mov ax,data
mov ds,ax
mov si,16
mov di,19
mov ax,0B800H
mov es,ax
mov bp,7C0H
s0: mov bx,0
mov ah,ds:[si]
mov cx,16
s: mov al,[bx]
mov es:[bp],al
mov byte ptr es:[bp+1],ah
inc bx
add bp,2
loop s
add bp,128
inc si
mov cx,ds:[di]
inc di
jcxz s0
mov ax,4c00h
int 21h
code ends
end start
如有好的设计,不凡一起讨论!! | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-11-13 15:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-11-06 14:36 |
这个是我的实现:
ssume cs:code,ds:data
data segment
db 'welcome to masm!'
data ends
code segment
start:mov ax,data
mov ds,ax
mov bp,0
mov cx,11
r:add bp,00a0h
loop r
mov ax,0b800h
mov es,ax
mov di,0
mov bx,0
mov si,0
mov cx,16
s:mov al,ds:[bx+si]
mov es:[bp+64+0+di],al
mov ah,02h
mov es:[bp+64+1+di],ah
mov es:[bp+64+160+0+di],al
mov ah,24h
mov es:[bp+64+160+1+di],ah
mov es:[bp+64+320+0+di],al
mov ah,71h
mov es:[bp+64+320+1+di],ah
inc si
add di,2
loop s
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-11-14 06:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-10-27 02:35 |
|
|
|
|
|
[第6楼]
[ 回复时间:2008-11-14 23:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48 |
不至于吧,呵呵
不可能是程序把显卡弄坏的,上面的这个程序和你看显卡可是不同层面的东西。 | | |
|
|
|
|
[第7楼]
[ 回复时间:2008-11-15 15:05 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-10-14 21:07 |
assume cs:codesg,ds:datasg
datasg segment
db 02h,24h,71h,'welcome to masm!'
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0 ;index of stored attribute
mov di,3 ;index of stored sentence
mov cx,3 ;loop times of showing sentence
mov ax,0b800h ;segment address of video memory
mov es,ax
mov bx,0720h ;offset address of video memory
s:push cx
push bx
mov cx,16 ;loop times of showing seperate character
s0:mov al,[di]
mov es:[bx],al
mov al,[si]
mov es:[bx+1],al
add bx,2
inc di
loop s0
pop bx
pop cx
inc si
mov di,3
add bx,00a0h
loop s
mov ax,4c00h
int 21h
codesg ends
end start
注意:pop bx,pop cx顺序,应和push时的次序相反.
否则会造成死循环. | | |
|
|
|
|
[第8楼]
[ 回复时间:2008-12-10 16:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-17 13:51 |
c:\masm\1.asm(17): Out of memory
内存溢出? | | |
|
|
|
|
[第9楼]
[ 回复时间:2009-02-01 22:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2009-01-28 11:57 |
我编了一个,不知是三循环吗?
assume cs:code,ss:stack,ds:data
data segment
db 'welcome to masm!'
data ends
stack segment
db 16 dup (0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov ax,0b800h
mov es,ax
mov si,0720h
mov dx,02h
mov cx,1
push cx
mov cx,2
push cx
s0: push cx
mov cx,16
mov bx,0
s: mov ax,[bx]
mov es:[si],ax
mov es:[si+1],dx
add si,2
inc bx
loop s
mov si,07c0h
mov dx,24h
pop cx
loop s0
mov si,0860h
mov dx,71h
pop cx
loop s0
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第10楼]
[ 回复时间:2009-02-12 13:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:4
注册日期:2009-01-15 22:41 |
assume cs:codesg, ds:datasg
datasg segment
db 'welcome to masm!'
db 02h,24h,71h
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov bx,0 ;bx定位目标行
mov si,0 ;si用来定位datasg中要显示的字符
mov ax,0b872h
mov es,ax
mov di,0 ;使es:[di]指向要显示的第一个单元
mov bp,16 ;ds:[bp] 用来定位属性
mov cx,3
s: push cx
mov cx,16
s0: mov al,ds:[si] ;al存放字符ascii码
mov ah,ds:[bp] ;ah存放属性
mov es:[bx+di],al ;偶位存放字符ascii码
mov es:[bx+di+1],ah ;奇位存放属性
inc si
add di,2
loop s0
mov si,0 ;一定要加这句,三次都要循环读取同样的'welcome to masm!'
inc bp
add bx,128
pop cx
loop s
mov ax,4c00h
int 21h
codesg ends
end start
好像有点小问题,就是找不出来。 | | |
|
|
|
|
[第11楼]
[ 回复时间:2009-02-27 14:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-02-22 22:46 |
assume cs:code
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,0b800h
mov ds,ax
mov bx,1920 ;ds:[bx]指向第12行第一个字符的显存
mov ax,data
mov es,ax
mov cx,3
mov bp,0
s0: push cx
mov cx,16
mov si,0
mov di,0
s: mov al,es:[di]
mov [bx+64+si],al ;显示的字母
mov ah,es:[bp+16]
mov [bx+65+si],ah ;显示的颜色
add si,2
inc di
loop s
pop cx
add bx,160 ;显示下一行
inc bp ;改变颜色
loop s0
mov ax,4c00h
int 21h
code ends
end start
贴个玩玩 | | |
|
|
|
|
[第12楼]
[ 回复时间:2009-03-02 10:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:5
注册日期:2008-12-18 16:07 |
那个程序的效果图是什么样的,能贴出来看看吗?想看看编出来的是样子的 | | |
|
|
|
|
[第13楼]
[ 回复时间:2009-03-02 21:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-02-22 22:46 |
|
|
|
|
|
[第14楼]
[ 回复时间:2009-03-04 13:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-02-21 14:11 |
我的写得简单了 没有你们的思维复杂 可能我是新手吧
ASSUME CS:CODESG
DATA SEGMENT
dw 119,101,99,111,109,101,32,109,97,115,109,33
DATA ENDS
CODESG SEGMENT
START: MOV AX,DATA
MOV DS,AX
MOV BX,0
MOV AX,0B800H
MOV ES,AX
MOV CX,12
S: MOV DX,DS:[BX]
MOV ES:[BX],DX
mov es:[bx+160],dx
mov es:[bx+320],dx
mov es:[bx+1],0CAh
mov es:[bx+161],42h
mov es:[bx+321],71h
add bx,2
LOOP S
MOV AX,4C00H
INT 21H
CODESG ENDS
END START | | |
|