王爽汇编实验10.1问题求解

;王爽实验10,编写显示字符串子程序;(dh)=行号,取值范围0~24;(dl)=列号,取值范围0~79;(cl)=颜色,ds:si指向字符串的首地址;例子:在屏幕第8行... ;王爽实验10,编写显示字符串子程序
;(dh)=行号,取值范围0~24
;(dl)=列号,取值范围0~79
;(cl)=颜色,ds:si指向字符串的首地址
; 例子:在屏幕第8行,3列,用绿色显示data段中的字符串

以下是我写的例子:
assume cs:code

date segment
db 'Welcome to masm!',0
date ends

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

show_str:push cx

dec dh
mov ax,0b800h
mov es,ax ;设置es为显存段地址
mov al,160
mul dh ;ax=ah*160 找行

mov bx,ax

dec dl
mov ax,2
mul dl

add bx,ax ;bx为目标偏移地址
push bx
push si
s0: ;将字符串存入显存
mov cl,[si]
mov ch,0
jcxz ok
mov es:[bx],cl
add bx,2
loop s0

ok: add bx,2
mov byte ptr es:[bx],0 ;将0字符存入

pop si
pop bx
pop ax
inc bx

s1: mov cl,[si] ;存入颜色
mov ch,0
jcxz ok
mov es:[bx],al
add bx,2
loop s1

push ax
pop cx

ret

code ends
end start

有一个地方错误不知道在哪里请帮忙找一下,顺便请教下汇编有什么方法可以找出编译错误!!
展开
 我来答
百度网友f6753a1fd
2011-07-28 · TA获得超过821个赞
知道小有建树答主
回答量:294
采纳率:0%
帮助的人:364万
展开全部
LZ的这个程序的毛病比较多,比如:

第一个循环里,每一次循环si都没有自增加1,所以造成取出来的字符都一样

而且在循环体内,cl表示颜色,loop要自减去CX用来循环,这个都混到一块去了,如何能保证取出的字符数量的正确性?

还有别的问题吧, LZ还是再重写一个吧 !

记着,保证每次循环结束后,源地址si,和目的地址bx,要增加
循环开始要保存循环次数cx,结束循环前恢复
追问
受教了··初学没几天  呵呵··谢谢···
追答
;王爽实验10,编写显示字符串子程序
;(dh)=行号,取值范围0~24
;(dl)=列号,取值范围0~79
;(cl)=颜色,ds:si指向字符串的首地址
; 例子:在屏幕第8行,3列,用绿色显示data段中的字符串

assume cs:codesg,ds:datasg

datasg segment
db 'Welcome to masm!',0
datasg ends

codesg segment

start: mov dh,8
mov dl,3
mov cl,2
mov ax,datasg
mov ds,ax ; 初始化数据段
mov ax,0b800h
mov es,ax ; es指向视频缓冲区
mov si,0 ; 初始化si指向字符串源地址

call show_str ; 调用显示字符串的子程序

mov ax,4c00h ; 调用结束,退出
int 21h

show_str:
mov ax,160
dec dh
mul dh
add ax,6 ; 计算出显示字符串的首地址
mov di,ax ; 指向视频缓冲区的目的地址
mov cx,16 ; 字符串长度, 即循环次数

loop_print:
push cx ; 保存循环次数,因为cl还要存放字符颜色
xor ax,ax
mov al,[si] ; 取字符
mov es:[di],al ; 写入视频缓冲区
mov cl,2 ; 设置字符颜色
mov es:[di+1],cl ;
inc si ; 指向下一个字符
inc di ;
inc di ; 指向下一个视频缓冲区中存放字符的位置
pop cx ; 恢复循环次数
loop loop_print ; 循环次数不为0,则继续循环

ret
codesg ends

end start
; 改程序必须将cmd窗口设置为全屏才能看到结果
华芯测试
2024-09-01 广告
电学测试台是深圳市华芯测试科技有限公司的核心设备之一,它集成了高精度测量仪器与自动化控制系统,专为半导体芯片、电子元件及模块的电性能检测而设计。该测试台能够迅速、准确地完成电压、电流、电阻、电容及频率等关键参数的测试,确保产品质量符合行业标... 点击进入详情页
本回答由华芯测试提供
魔方实验室
2011-07-28 · TA获得超过772个赞
知道小有建树答主
回答量:267
采纳率:0%
帮助的人:60.6万
展开全部
call完之后mov ax,4c00h int 21h,好久没看过了。去年我写过一个例子http://hi.baidu.com/5858978/blog/item/2b94cdfd8627428eb901a095.html
16位汇编用Masm for Windows 集成实验环境,32位的推荐radasm
追问
我找了一个正确了  编译连接成EXE文件了··可是运行后怎么在屏幕闪一下就没了··不能显示出字···为什么····要在哪里运行···
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bucks1964
2012-07-31
知道答主
回答量:3
采纳率:0%
帮助的人:2.9万
展开全部
assume cs:code
date segment
db 'Welcome to masm!',0
date ends
code segment
start: mov dh,8
mov dl,3
mov cl,2
mov ax,date
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str: push si
push dx
push cx

mov ax,0b800h
mov es,ax ;设置es为显存段地址
dec dh
mov al,0a0h
mul dh ;ax=(dh-1)*160 找行
mov bx,ax ;行偏移地址存bx中
dec dl
mov ax,2
mul dl ;ax=(dl-1)*2 找列
add bx,ax ;bx为目标偏移地址=(dh-1)*160+(dl-1)*2

s0: mov cl,[si] ;将字符串存入显存
mov ch,0
jcxz ok
mov byte ptr es:[bx],cl
pop cx
mov byte ptr es:1[bx],cl
push cx
inc si
add bx,2
jmp short s0

ok: pop cx
pop dx
pop si
ret
code ends
end start
这个是修改后的源码,在全屏方式下可以运行看效果.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式