. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  为什么把es:[di]改为es:[di+3]是错的!!  [已解决] 回复[ 5次 ]   点击[ 417次 ]  
oldmtn
[帖 主]   [ 发表时间:2008-08-14 18:49 ]   [引用]   [回复]   [ top ] 
荣誉值:5
信誉值:3
注册日期:2008-07-14 19:30
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:
mov di,0
mov al,0a0h
mul dh
mov dh,16
div dh
add ax,0B800h
mov es,ax
mov dh,cl
mov bl,dl
mov bh,0
s:mov cl,[si]
  mov ch,0
  jcxz ok
  mov dl,[si]
  mov es:[di],dx
  inc si
  add di,2
  jmp short s
ok:ret
code ends
end start
============================== f
这是实验10的第一小题,。。。
请高手指教
oldmtn
[第1楼]   [ 回复时间:2008-08-14 18:49 ]   [引用]   [回复]   [ top ] 
荣誉值:5
信誉值:3
注册日期:2008-07-14 19:30
在线等!!!!!!在线等!!!!!!在线等!!!!!!在线等!!!!!!在线等!!!!!!
ppt
[第2楼]   [ 回复时间:2008-08-15 17:26 ]   [引用]   [回复]   [ top ] 
荣誉值:56
信誉值:0
注册日期:2007-09-23 18:23
还在等吗?哈哈。
es:[di]中是显存的地址,显示的字符要放在偶数位置 奇数位置存放的是颜色属性. 所以+3  +4 什么的......
fontomas
[第3楼]   [ 回复时间:2008-08-19 04:00 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22
楼上正解。
显示缓冲区中,一个字符占两个字节的存储空间。而偶地址(低地址)是存放字符的,所以第3列对应的应该是06-07单元(或者04-05单元,我习惯下标从0开始)。所以直接用DI+3是不可以的,应该是DI+3*2或者DI+(3*2-2)
oldmtn
[第4楼]   [ 回复时间:2008-08-23 16:27 ]   [引用]   [回复]   [ top ] 
荣誉值:5
信誉值:3
注册日期:2008-07-14 19:30
懂了,谢谢大家。。

体会:要注意列的设置,1.mov al,2  ;dl存列数         |2.mov al,2  
                     mul dl                     |    shl al,1
                  此时ax 存的就是字符的偏移地址    |      同样
oldmtn
[第5楼]   [ 回复时间:2008-08-23 16:28 ]   [引用]   [回复]   [ top ] 
荣誉值:5
信誉值:3
注册日期:2008-07-14 19:30
此贴由 贴主 于 [ 2008-08-23 16:28 ] 结贴。 结贴原因:问题已解决
得分情况: 2楼(ppt):2分   3楼(fontomas):2分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved