. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9的一个问题  [已解决] 回复[ 5次 ]   点击[ 672次 ]  
qiangzi
[帖 主]   [ 发表时间: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指向显示缓存区吗?
qiangzi
[第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
versaariel
[第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好,个人观点
qiangzi
[第3楼]   [ 回复时间:2010-01-23 15:31 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37
谢谢二楼的解释!!!!
versaariel
[第4楼]   [ 回复时间:2010-01-23 15:35 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
不谢,一起学习^-^
qiangzi
[第5楼]   [ 回复时间:2010-01-23 19:32 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37
此贴由 贴主 于 [ 2010-01-23 19:32 ] 结贴。 结贴原因:问题已解决
得分情况: 2楼(versaariel):6分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved