王爽汇编实验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
有一个地方错误不知道在哪里请帮忙找一下,顺便请教下汇编有什么方法可以找出编译错误!! 展开
;(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
有一个地方错误不知道在哪里请帮忙找一下,顺便请教下汇编有什么方法可以找出编译错误!! 展开
3个回答
展开全部
LZ的这个程序的毛病比较多,比如:
第一个循环里,每一次循环si都没有自增加1,所以造成取出来的字符都一样
而且在循环体内,cl表示颜色,loop要自减去CX用来循环,这个都混到一块去了,如何能保证取出的字符数量的正确性?
还有别的问题吧, LZ还是再重写一个吧 !
记着,保证每次循环结束后,源地址si,和目的地址bx,要增加
循环开始要保存循环次数cx,结束循环前恢复
第一个循环里,每一次循环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 广告
2024-09-01 广告
电学测试台是深圳市华芯测试科技有限公司的核心设备之一,它集成了高精度测量仪器与自动化控制系统,专为半导体芯片、电子元件及模块的电性能检测而设计。该测试台能够迅速、准确地完成电压、电流、电阻、电容及频率等关键参数的测试,确保产品质量符合行业标...
点击进入详情页
本回答由华芯测试提供
展开全部
call完之后mov ax,4c00h int 21h,好久没看过了。去年我写过一个例子http://hi.baidu.com/5858978/blog/item/2b94cdfd8627428eb901a095.html
16位汇编用Masm for Windows 集成实验环境,32位的推荐radasm
16位汇编用Masm for Windows 集成实验环境,32位的推荐radasm
追问
我找了一个正确了 编译连接成EXE文件了··可是运行后怎么在屏幕闪一下就没了··不能显示出字···为什么····要在哪里运行···
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
这个是修改后的源码,在全屏方式下可以运行看效果.
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
这个是修改后的源码,在全屏方式下可以运行看效果.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询