|
主题 : : 实验9自已编完后有调试中有一些不明白的地方,请教高手 [待解决] |
回复[ 30次 ]
点击[ 2296次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2007-06-24 21:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:5
信誉值:3
注册日期:2007-06-24 20:51 |
我在编写实验9的课件中遇到以下问题我没有看课件答案,这是我自已先编写,如果一步用g 命令直接到 mov ax,4c00h地址的话,结果就是正常的达到要求,但是如果用t命令和遇到循环后用p命令就会有些字符没有了,比如我如下的代码 如果用t和p命令调试的话,最后结果就会每一行少一个w字符,这是怎么个一会事,请高手点一下?
代码如下:
assume cs:codesg,ds:datasg,ss:stack
datasg segment
db 'welcome to masm!'
datasg ends ;1、00000010b绿色 2h ;2、00100100b绿底红字 24h
;3、01110001b 白底蓝字71h
codesg segment
start: mov ax,datasg
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,16
mov si,0
mov di,0
s: mov al,[bx]
mov ah,2h ;设成绿字
mov es:720h[si],ax
mov ah,24h ;设成绿底红字
mov es:7c0h[si],ax
mov ah,71h ;设成白底蓝字
mov es:860h[si],ax
add si,2
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2007-08-03 15:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:179
信誉值:6
注册日期:2007-07-09 19:18 |
在用p命令执行loop s前已经把3行的w显示完了但是因为滚屏了所以在屏幕上没有了显示,此时用p命令执行loop s后就会把剩下的都显示出来。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2007-10-05 11:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-09-04 14:41 |
mov es:720h[si],ax
楼主做的这个我认为是最符合题目要求的!
呵呵 ,我就是想不通怎么确定要打印的字符是在屏幕的正中央,es:720这个是行坐标吧?是屏幕中间的行坐标...那列坐标呢? | | |
|
|
|
|
[第3楼]
[ 回复时间:2007-10-05 11:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:106
信誉值:0
注册日期:2007-06-26 15:10 |
屏幕列位80 行为25
每个字符在屏幕显示需要2个字节(第一个字节显示字符的ASCII码,第二个字符存储字符属性)
屏幕中心位置,自己可以算一下呵呵 | | |
|
|
|
|
[第4楼]
[ 回复时间:2007-10-13 17:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:2
注册日期:2007-09-12 21:29 |
|
|
|
|
|
[第5楼]
[ 回复时间:2007-10-21 22:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2007-10-13 18:48 |
如果一个屏幕无限大,那么它的中间位置你怎么样算出来?
我觉得还需要用一个loop算位置,不能自己去算那个位置。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2007-10-22 01:20 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2007-10-10 19:41 |
to tiantian
你这个程序不错,请问有没有好的方法计算第一个的中间位置。
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,16
mov si,0
mov di,0
s: mov al,[bx]
mov ah,2h
mov es:720h[si],ax
mov ah,24h
mov es:7c0h[si],ax
mov ah,71h
mov es:860h[si],ax
add si,2
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end start | | |
|
|
|
|
[第7楼]
[ 回复时间:2007-10-23 22:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2007-10-05 15:18 |
行数的计算当然要看屏幕的行与列数,如果能判断当前的屏幕行与列数,就可以计算.但是到目前为止好象从程序中还不能知道 | | |
|
|
|
|
[第8楼]
[ 回复时间:2008-05-22 20:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:16
注册日期:2008-03-17 20:21 |
|
|
|
|
|
[第9楼]
[ 回复时间:2008-05-28 23:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2008-04-02 16:04 |
assume cs:code,ds:data
;没有使用堆栈,只使用单循环,目的是尽量地使程序简捷,仅供参考.
data segment
db 'welcome to masm!'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov cx,16
mov di,0
mov si,0720h ;算出屏幕中间的显存的偏移位置放入SI中,一定要为偶数,否则输出为乱码,原因见题目资料。
s: mov al,[di]
mov ah,02h
mov es:[si],ax ;用AH存放字符颜色属性,AL存放字符
mov bl,[di]
mov bh,24h
mov es:[0a0h+si],bx
mov dl,[di]
mov dh,71h
mov es:[140h+si],dx
inc di
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第10楼]
[ 回复时间:2008-08-11 21:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22 |
晕哦,楼主的思路和我的一模一样!
还好,我是自己想出来的,我没有看楼主的,不然差点整成抄袭了…… | | |
|
|
|
|
[第11楼]
[ 回复时间:2008-08-21 14:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-07 14:48 |
我做的 感觉有点长了
assume cs:code
a segment
db 'welcome to masm!',0c2h,24h,31h
a ends
code segment
start:
mov ax,a
mov es,ax
mov ax,0b86eh
mov ds,ax
mov bx,40h
mov di,0
mov si,10h
mov cx,10h
s:
mov al,es:[di]
mov [bx],al
mov [bx+0a0h],al
mov [bx+140h],al
inc bx
mov al,es:[si]
mov [bx],al
mov al,es:[si+1]
mov [bx+0a0h],al
mov al,es:[si+2]
mov [bx+140h],al
inc bx
inc di
loop s
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第12楼]
[ 回复时间:2008-08-21 14:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-03-07 14:48 |
楼主的 程序还能减少 可以把 颜色的那3个字节 也节约掉了 | | |
|
|
|
|
[第13楼]
[ 回复时间:2009-02-12 11:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-29 12:37 |
由于我的是vista系统,不支持dos全屏,所以做完了也不知道能不能实现题中要求效果,有什么不对的地方望大家指正。
ASSUME CS:code
data SEGMENT
DW 7702h,6502h,6c02h,6302h,6f02h,6d02h,6502h,2002h ;用16进制表示字符串,02表示属性
DW 7724h,6524h,6c24h,6324h,6f24h,6d24h,6524h,2024h
DW 7771h,6571h,6c71h,6371h,6f71h,6d71h,6571h,2071h
data ENDS
stack SEGMENT
DB 16 DUP(0)
stack ENDS
code SEGMENT
start:
MOV AX,data
MOV DS,AX
MOV SI,0
MOV AX,stack
MOV SS,AX
MOV SP,16
MOV DI,0720h
MOV AX,0b800h
MOV ES,AX
MOV CX,3
s0:PUSH CX
PUSH DI
MOV CX,8
s1:MOV AX,[SI]
MOV ES:[DI],AX
ADD SI,2
ADD DI,2
LOOP s1
POP DI
JMP WORD PTR ES:[DI] ;cs:ip跳转到b800:0720执行
ADD DI,00a0h ;di指向下一行的中间,也就是跳过160个字节
POP CX
LOOP s0
MOV AX,4c00h
INT 21h
code ENDS
END start | | |
|
|
|
|
[第14楼]
[ 回复时间:2009-02-12 12:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48 |
由于我的是vista系统,不支持dos全屏
---------------
??真的吗?虽然没有用过vista,这种bug微软是绝对不会犯的吧! | | |
|
|
|
|
[第15楼]
[ 回复时间:2009-02-12 16:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-29 12:37 |
??真的吗?虽然没有用过vista,这种bug微软是绝对不会犯的吧!
------------------
回复:是的,但不是bug,据说是微软处于安全考虑而特意设计的.. | | |
|
|
|
|
[第16楼]
[ 回复时间:2009-03-21 00:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2008-12-11 08:43 |
??真的吗?虽然没有用过vista,这种bug微软是绝对不会犯的吧!
------------------
回复:是的,但不是bug,据说是微软处于安全考虑而特意设计的..
------------------
回复:我用的就VISTA,是可以全屏的! | | |
|
|
|
|
[第17楼]
[ 回复时间:2009-03-21 00:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2008-12-11 08:43 |
|
|
|
|
|
[第18楼]
[ 回复时间:2009-03-22 20:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-03-15 23:05 |
|
|
|
|
|
[第19楼]
[ 回复时间:2009-09-06 16:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-11-27 01:10 |
是分三行显示的吗?不是要求在一行上面显示?好像不符合题意!! | | |
|
|
|
|
[第20楼]
[ 回复时间:2009-12-19 21:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17 |
呵呵 两年了啊
教材上给了一屏所包含的字节量了 0FA0H
除以2 再减1或加一能屏幕中间位置
但是感觉也不好
还有好的方法吗?
思考中。。
各位学长有好的方法请提示一下
谢谢
关注中。。 | | |
|
|
|
|
[第21楼]
[ 回复时间:2010-01-13 17:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53 |
想了半天,一屏是4000字节,半屏中心点是2000字节,因为是16字节输入,所以应该减去8为1992字节,这个位置应该是中间那个字符串的起始位置,换算成16进制应该是7c8啊,好象是这样,有点出入,不知道哪里错了,哦,因为还有色彩要占8个位置,所以还要减去8,变成7c0,每行相隔160字节,也就是a0h,相加860h,相减720h,哎,十六进制真晕人啊 | | |
|
|
|
|
[第22楼]
[ 回复时间:2010-07-18 13:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:6
注册日期:2010-07-13 10:33 |
|
|
|
|
|
[第23楼]
[ 回复时间:2010-07-18 13:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:6
注册日期:2010-07-13 10:33 |
|
|
|
|
|
[第24楼]
[ 回复时间:2010-07-19 10:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
顶5楼,我觉得如何找到中间位置是这个程序的侧重点,而我们都忽略了。 | | |
|
|
|
|
[第25楼]
[ 回复时间:2010-07-19 11:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:3
信誉值:0
注册日期:2008-06-04 16:24 |
|
|
|
|
|
[第26楼]
[ 回复时间:2012-02-01 14:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2012-01-03 21:14 |
所说的滚屏就是比方说每行从开始的在内存单元存入w开始慢慢往后直到最后那个感叹号,是么,
另外就是,那为什么用g指令却可以全部都显示呢?? | | |
|
|
|
|
[第27楼]
[ 回复时间:2012-02-01 14:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:0
注册日期:2012-01-03 21:14 |
回复:[第1楼]
------------------
所说的滚屏就是比方说每行从开始的在内存单元存入w开始慢慢往后直到最后那个感叹号,是么,
另外就是,那为什么用g指令却可以全部都显示呢?? | | |
|
|
|
|
[第28楼]
[ 回复时间:2012-03-14 17:02 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-03-01 16:15 |
assume cs:code,ds:data
data segment
db 'welcome to masm!'
data ends
code segment
start:mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov cx,16
mov di,0
mov si,780h
mov bx,0
s1:
mov al,[di]
mov ah,00000010b
mov es:[si+40h+bx],ax
inc di
add bx,2
loop s1
mov cx,16
mov di,0
mov bx,0
add si,0a0h
s2:
mov al,[di]
mov ah,00100100b
mov es:[si+40h+bx],ax
inc di
add bx,2
loop s2
mov cx,16
mov di,0
mov bx,0
add si,0a0h
s3:
mov al,[di]
mov ah,01110001b
mov es:[si+40h+bx],ax
inc di
add bx,2
loop s3
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第29楼]
[ 回复时间:2012-03-22 11:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-02-24 22:26 |
assume cs:code
data segment
db 'welcome to masm!'
data ends
code segment
start:mov ax,data
mov ds,ax
mov ax,0b878h
mov es,ax
mov bx,0
mov cx,16
mov ah,27h
s:mov al,[bx]
sal bx,1
mov es:[bx+64],al
mov es:[bx+65],ah
sar bx,1
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
就显示一个颜色吧,好像不用写那么长吧,我这样也能正确显示 | | |
|
|
|
|
[第30楼]
[ 回复时间:2012-07-30 22:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-07-30 22:40 |
|