王爽的《汇编语言》的一个问题

S7654321 2009-04-15 07:54:49

学习王爽的汇编语言,有个程序是在屏幕显示“Welcome to masm!”我想在第10行25列开始显示,但是运行是总是显示在第一行,请高手帮忙
assume cs:code,ds:data
data segment
db 'welcome to masm!',0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov dh,10
mov dl,25
mov cl,2
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str:
mov ax,0b800h
mov es,ax
mov ah,160
mul dh
mov dh,dl
add dl,dh
mov dh,0
add ax,dx
mov bx,ax
mov al,cl
mov cl,0
s:
mov ch,ds:[si]
jcxz ok
mov es:[bx],ch
mov es:[bx+1],al
add bx,2
inc si
jmp short s
ok:
ret
code ends
end start
...全文
182 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
S7654321 2009-04-16
  • 打赏
  • 举报
回复
谢谢两位
我找到错误的地方了
mov ah,160
mul dh
应该是
mov al ,160
mul dh
惭愧,基础没打好
pla_007 2009-04-15
  • 打赏
  • 举报
回复
将楼主的代码加了注释,并稍微改了一下。
程序其实主要是利用直接向屏幕缓冲区直接写来显示的。首先,你要知道在彩色文本模式下,可以显示80*25个字符。其显示段位于B800处。
每一个要屏幕上显示的字符占用2个字节,第一个字节为ASCII码,第二个字节为显示的属性。即屏幕上一行占用80*2 = 160个字节的缓冲区。
这样就知道如果想在第10行,25列显示。应该在段B800加上10*160 + 25*2处显示。
至于你提供的代码里的算法,感觉太复杂,所以没去仔细看。抱歉!

另外,讲一下编码网络,尤其是排版,虽然程序是要运行的,但是也要兼顾给别人看。适当、准确的缩进是良好的编码风格,建议多用Tab键!


附:修改后的代码


assume cs:code,ds:data
data segment
db 'welcome to masm!, Please any key to end!',0
data ends

code segment
start:
mov ax,data ;将字符串所在的段送入ds
mov ds,ax

mov cl,2 ;设置字符属性
mov si,0 ;字符串指针,初始化为0,指向第一个字符
call show_str ;调用显示字符串子函数

mov ah,1 ;等待键入一个字符,以结束程序
int 21h
mov ax,4c00h ;结束程序
int 21h

show_str:
mov ax,0b800h ;将视频缓区的段址送入ES
mov es,ax

mov bx,10*160+25*2 ;行号*160+列号*2 = 在视频缓区中的偏移量
;在此处,我选择在第10行,第5列开始显示

mov al,cl ;将属性保存到AL
mov cl,0 ;CL未用到,但需要置0
s:
mov ch,ds:[si] ;将字符存放到CH
jcxz ok ;如果字符值cx = 0,说明字符串结束
mov es:[bx],ch ;将字符存放到屏幕缓冲区
mov es:[bx+1],al ;将属性传到屏幕缓冲区
add bx,2 ;移到下一个显示单元
inc si ;字符指针si+1
jmp short s ;继续显示下一个字符
ok:
ret
code ends
end start


BAYNPU 2009-04-15
  • 打赏
  • 举报
回复
参考一下吧:
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10h
mov bx,0
mov di,0
mov ax,0b872h
mov cx,3
s3: push cx
push ax
push di
mov es,ax
mov si,0
mov di,0
mov cx,10h
s1: mov al,ds:[bx+si]
mov es:[bx+di],al
inc si
add di,2
loop s1
mov si,1
pop di
mov al,ds:10h[bx+di]
mov cx,10h
s2: mov es:[bx+si],al
add si,2
loop s2
inc di
pop ax
add ax,0ah
pop cx
loop s3
mov ax,4c00h
int 21h
code ends
end start

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧