|
主题 : : 【实验九详解】 [已解决] |
回复[ 6次 ]
点击[ 1315次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-07-25 12:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
这个实现方法是用一个循环逐列显示字符。
;--------------------------------------------------------------------------------------
assume cs:code
data segment
db 'Welcome to Masm!'
data ends
code segment
start:
mov ax,data ;装入DS
mov ds,ax
mov ax,0b800h ;指定显示区域DS
mov es,ax
mov bx,0 ;首地址
mov bp,60 ;列的初始值
mov cx,16 ;16次循环
s: mov si,12*160 ;行的初始值
mov ah,72h ;指定颜色
mov al,[bx] ;装入ASCII字符
mov es:[si+bp],ax ;把白底绿字装入指定位置
add si,160 ;指向下一行
mov ah,24h ;指定颜色
mov al,[bx] ;装入ASCII字符
mov es:[si+bp],ax ;将绿底红字装入指定位置
add si,160 ;指向下一行
mov ah,17h ;指定颜色
mov al,[bx] ;装入ASCII字符
mov es:[si+bp],ax ;把白底蓝字装入指定位置
inc bx ;指向下一个字符
add bp,2 ;指向下一列位置
loop s
mov ah,4ch
int 21h
code ends
end start
;-------------------------------------------------------------------------------------- | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-07-25 13:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
第九行应该是
mov ax,0b800h ;指定显示区域ES | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-07-25 14:43 ]
[引用]
[回复]
[ top ] | |
荣誉值:15
信誉值:0
注册日期:2010-06-02 22:04 |
哈哈学习了,原来中间行的位置没必要自己去具体算出来的:mov si 12*160;哈哈 | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-07-25 14:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
|
|
|
|
|
[第4楼]
[ 回复时间:2010-07-28 21:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:5
信誉值:0
注册日期:2009-09-24 17:56 |
我这样做不知对不对
;程序功能:在内存地址B8000H - B8FFFFH共32KB的空间显示字符串
assume cs:code , ss:stack
stack segment
db 'welcome to masm!'
stack ends
code segment
start: mov ax,stack
mov es,ax
mov ax,0b800h
mov ds,ax
mov bx,820H
mov di,0
mov cx,10h
s: mov al,es:[di]
mov ah,00000010b;
mov ds:72[bx],ax
mov ah,00100100b
mov ds:232[bx],ax
mov ah,01110001b
mov ds:392[bx],ax
add bx,2
add di,1
loop s
mov ax ,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第5楼]
[ 回复时间:2010-08-02 22:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
再将这样的解法详解, 希望对大家有用吧。
;----------------------------------------------------------------------------------------
1 assume cs:code,ds:data
2 data segment
3 db 'welcome to masm!'
4 db 02h,24h,71h
5 data ends
6 code segment
7 start:
8 mov ax,data ;指定数据段DS
9 mov ds,ax
10 mov ax,0b800h ;显示区域为附加段ES
11 mov es,ax
12 mov di,780h ;ES:DI起始行
13 mov bx,10h ;颜色属性,地址为:DS:[BX]
14 mov cx,3 ;3个颜色
15 a: ;外循环对3中颜色循环, 依次是02,24h,71h
16 push cx ;由于内循环要用到cx,故保存
17 push di ;保存初始行
18 mov si,0 :字符首地址ds:si
19 mov cx,16 ;内循环开始,依次遍历16个字符
20 b: mov al,[si] ;将asacii放入al
21 mov ah,[bx] ;将属性放入ah
22 mov es:[di+40h],ax ;显示
23 inc si ;指向下一个字符
24 add di,2 ;指向下一个显示位置
25 loop b ;如cx=0,则内循环结束
26 pop di ;第一次循环结束,恢复初始行的值
27 pop cx ;恢复cx
28 inc bx ;ds:[bx+1],指向下一个属性
29 add di,0a0h ;第二行
30 loop a ;外循环,如3个属性遍历完毕则跳出循环
31
32 mov ah,4ch
33 int 21h
34 code ends
35 end start
;---------------------------------------------------------------------------------------- | | |
|
|
|
|
[第6楼]
[ 回复时间:2010-08-09 13:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
此贴由 贴主 于 [ 2010-08-09 13:59 ] 结贴。 结贴原因:问题已解决 | | |
|