|
主题 : : 实验9的一个问题 [已解决] |
回复[ 5次 ]
点击[ 672次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-01-23 12:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37 |
1 assume cs:code,ds:data
2 data segment
3 db'welcome to masm!'
4 data ends
5 code segment
6 start:mov ax,data
7 mov ds,ax ;ds指向段data
8 mov ax,0B800H
9 mov es,ax ;es指向显示缓存区
10 mov bx,0
11 mov bp,06E0H ;第12行
12 mov di,0
13 mov cx,16 ;循环次数16
14 s:mov al,[bx] ;字符
15 mov ah,00000010B ;绿色
16 mov es:[bp+di+40H],ax
17 mov ah,00100100B ;绿底红色
18 mov es:[bp+di+0E0H],ax
19 mov ah,01110001B ;白底蓝色
20 mov es:[bp+di+180H],ax
21 inc bx
22 add di,2
23 loop s
24 mov ah,01h ;论坛中看到的,暂停用
25 int 21h
26 mov ax,4c00h
27 int 21h
28 code ends
29 end start
上面程序正确,我已测试过,但是我的第一个程序出现执行错误
第一个程序:
1 assume cs:code,ds:data
2 data segment
3 db'welcome to masm!'
4 data ends
5 code segment
6 start:mov ax,data
7 mov ds,ax ;ds指向段data
8 mov bp,0B800H
9 mov es,bp ;ss指向显示缓存区
10 mov bx,0
11 mov bp,06E0H ;第12行
12 mov di,0
13 mov cx,16 ;循环次数16
14 s:mov al,[bx] ;字符
15 mov ah,00000010B ;绿色
16 mov [bp+di+40H],ax
17 mov ah,00100100B ;绿底红色
18 mov [bp+di+0E0H],ax
19 mov ah,01110001B ;白底蓝色
20 mov [bp+di+180H],ax
21 inc bx
22 add di,2
23 loop s
24 mov ah,01h ;论坛中看到的,暂停用
25 int 21h
26 mov ax,4c00h
27 int 21h
28 code ends
29 end start
只是第8,9,16,18,20不同,谁能解释一下,为什么不能用ss指向显示缓存区吗? | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-01-23 12:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37 |
补充错误程序执行过程:
F:\>cd huibian :
♂ ♂ ♀ ♪ ☼ ◙ ◙ ◙ ( ↕∙
F \HUIBI N>d bu 8 c.e‼e◙ °☺►F@ t◘C▬9φ♦♠ ‼
-t
AX=0C74 BX=0000 CX=0048 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0C64 ES=0C64 SS=0C74 CS=0C75 IP=0003 NV UP EI PL NZ NA PO NC
0C75:0003 8ED8 MOV DS,AX
-t
AX=0C74 BX=0000 CX=0048 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0C74 ES=0C64 SS=0C74 CS=0C75 IP=0005 NV UP EI PL NZ NA PO NC
0C75:0005 BD00B8 MOV BP,B800
-t
AX=0C74 BX=0000 CX=0048 DX=0000 SP=0000 BP=B800 SI=0000 DI=0000
AX=F8AF BX=0000 CX=0048 DX=0000 SP=0000 BP=AF0F SI=0000 DI=0000
DS=0C74 ES=0C64 SS=B800 CS=B004 IP=8536 OV UP DI PL NZ NA PO NC
B004:8536 5A POP DX | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-01-23 13:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14 |
16 mov [bp+di+40H],ax
17 mov ah,00100100B ;绿底红色
18 mov [bp+di+0E0H],ax
19 mov ah,01110001B ;白底蓝色
20 mov [bp+di+180H],ax
虽然ss是默认段地址,但是ss并不=es,访问的不是b800,DEBUG下应该很容易看出来吧
修改如下:
9 mov es,bp ;ss指向显示缓存区
mov ss,bp ;insert newline
mov sp,100h ;insert newline
10 mov bx,0
另外,最好加上段前缀,可能有些编译器会认为是DS
16 mov ss:[bp+di+40H],ax
17 mov ah,00100100B ;绿底红色
18 mov ss:[bp+di+0E0H],ax
19 mov ah,01110001B ;白底蓝色
20 mov ss:[bp+di+180H],ax
补充,
ss还是一个重要的机制,在你的显示代码中并没有用到ss-sp,但是一旦发生push,pop或中断,你的显示区域就有可能被改变,所以还是用es好,个人观点 | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-01-23 15:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37 |
|
|
|
|
|
[第4楼]
[ 回复时间:2010-01-23 15:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14 |
|
|
|
|
|
[第5楼]
[ 回复时间:2010-01-23 19:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37 |
此贴由 贴主 于 [ 2010-01-23 19:32 ] 结贴。 结贴原因:问题已解决 | | |
|