. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10 第一个显示字符子程序问题  [已解决] 回复[ 7次 ]   点击[ 393次 ]  
heiok.com
[帖 主]   [ 发表时间:2009-12-04 13:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2009-10-21 20:01
我想先测试一下,在第8行显示字符,按照80*25的彩色字符显示模式,第8行应是由这开始B800:0460

但我的初步程序单步运行时,字符却是显示在第 4 行 ,为何,如何将dh改为 12 ,则字符显示在第 8 行,好像总是相差 4 行,以下代码是哪里导致了这种情况的出现?
在debug状态下,用e命令在B800:0460又是正确的显示在第8行。

assume cs:code
data segment
        db 'Welcome to masm!',0
data ends

code segment
start:        mov dh,8
        mov dl,3
        mov cl,2
        mov ax,data
        mov ds,ax
        mov si,0
        call show_str

        mov ax,4c00h
        int 21h
show_str: push cx
         push dx
         mov ax,0b800h
         mov es,ax
         mov al,0A0h
         pop dx
         dec dh
         mul dh
s:         mov ch,0
         mov cl,[si]
         jcxz ok
         
         mov bp,ax
         
         mov bl,[si]
         mov bh,cl
         mov es:[bp],bx
                 
         inc si
         
         
         jmp short s

ok:          ret
         
         

code ends
end start
heiok.com
[第1楼]   [ 回复时间:2009-12-04 14:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2009-10-21 20:01
偶把代码最简单化,修改成这个样子,依旧是从第4行显示。

B800:0460不是指向显示缓存的第8行吗?
assume cs:code

code segment
start:        
         mov ax,0b800h
         mov es,ax
         mov ax,0460h
         mov bp,ax
         mov bx,0257h
         mov es:[bp],bx
                 
         

code ends
end start
heiok.com
[第2楼]   [ 回复时间:2009-12-04 18:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2009-10-21 20:01
以下程序按照题意,那就是在屏幕的第9行,第4列显示结果了。

assume cs:code 
data segment 
        db 'Welcome to masm!',0 
data ends 

code segment 
start:mov dh,8 
        mov dl,3 
        mov cl,2 
        mov ax,data 
        mov ds,ax 
        mov si,0 
        mov bh,cl
        call show_str 

        mov ax,4c00h 
        int 21h 
show_str: push cx 
         push dx 
         mov ax,0b800h 
         mov es,ax 
         mov al,0A0h 
         pop dx 
         mul dh 
         mov bp,ax 
         mov ax,0
         mov al,2
         mul dl
         mov di,ax
         
s:      mov ch,0 
         mov cl,[si] 
         jcxz ok 
         mov bl,[si] 
         mov es:[bp+di],bx 
         inc si 
         add di,2
         jmp short s 
ok:    pop cx
         ret 
code ends 
end start
tinyparticle
[第3楼]   [ 回复时间:2009-12-04 18:18 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
B800:0460不是指向显示缓存的第8行吗? 
=================================================
;参数:(dh)=行号(取值范围0~24); 
;     (dl)=列号(取值范围0~79); 
mov ax,0b800h 
mov es,ax 
mov bx,(160*dh+dl*2)

(160*dh+dl*2)设置es:bx指向显存首地址
tinyparticle
[第4楼]   [ 回复时间:2009-12-04 18:30 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
2楼程序没有问题呀
tinyparticle
[第5楼]   [ 回复时间:2009-12-04 18:30 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
从0开始计算的,行列显示位置正确
heiok.com
[第6楼]   [ 回复时间:2009-12-04 23:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2009-10-21 20:01
谢谢楼上的。。。。就是想搞清楚是由0开始还是由1开始算这个数。
heiok.com
[第7楼]   [ 回复时间:2009-12-04 23:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2009-10-21 20:01
此贴由 贴主 于 [ 2009-12-04 23:07 ] 结贴。 结贴原因:问题已解决
得分情况: 3楼(tinyparticle):4分   4楼(tinyparticle):4分   5楼(tinyparticle):4分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved