. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9自已编完后有调试中有一些不明白的地方,请教高手  [待解决] 回复[ 30次 ]   点击[ 2296次 ]  
tiantian
[帖 主]   [ 发表时间: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
cxn
[第1楼]   [ 回复时间:2007-08-03 15:30 ]   [引用]   [回复]   [ top ] 
荣誉值:179
信誉值:6
注册日期:2007-07-09 19:18
在用p命令执行loop s前已经把3行的w显示完了但是因为滚屏了所以在屏幕上没有了显示,此时用p命令执行loop s后就会把剩下的都显示出来。
jznhljg
[第2楼]   [ 回复时间:2007-10-05 11:11 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-09-04 14:41
mov es:720h[si],ax  
楼主做的这个我认为是最符合题目要求的!
呵呵 ,我就是想不通怎么确定要打印的字符是在屏幕的正中央,es:720这个是行坐标吧?是屏幕中间的行坐标...那列坐标呢?
sunshine
[第3楼]   [ 回复时间:2007-10-05 11:42 ]   [引用]   [回复]   [ top ] 
荣誉值:106
信誉值:0
注册日期:2007-06-26 15:10
屏幕列位80 行为25
每个字符在屏幕显示需要2个字节(第一个字节显示字符的ASCII码,第二个字符存储字符属性)
屏幕中心位置,自己可以算一下呵呵
cctdbnj
[第4楼]   [ 回复时间:2007-10-13 17:18 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2007-09-12 21:29
楼主这个写的棒!
lson-jie
[第5楼]   [ 回复时间:2007-10-21 22:25 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2007-10-13 18:48
如果一个屏幕无限大,那么它的中间位置你怎么样算出来?
我觉得还需要用一个loop算位置,不能自己去算那个位置。
leonmsi
[第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
mqmelon
[第7楼]   [ 回复时间:2007-10-23 22:38 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2007-10-05 15:18
行数的计算当然要看屏幕的行与列数,如果能判断当前的屏幕行与列数,就可以计算.但是到目前为止好象从程序中还不能知道
debugkkk
[第8楼]   [ 回复时间:2008-05-22 20:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2008-03-17 20:21
写的好,学习了
thisguy
[第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
fontomas
[第10楼]   [ 回复时间:2008-08-11 21:15 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22
晕哦,楼主的思路和我的一模一样!
还好,我是自己想出来的,我没有看楼主的,不然差点整成抄袭了……
tlzbl
[第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
tlzbl
[第12楼]   [ 回复时间:2008-08-21 14:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-03-07 14:48
楼主的  程序还能减少  可以把 颜色的那3个字节 也节约掉了
max_2546
[第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
mess
[第14楼]   [ 回复时间:2009-02-12 12:42 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
由于我的是vista系统,不支持dos全屏
---------------
??真的吗?虽然没有用过vista,这种bug微软是绝对不会犯的吧!
max_2546
[第15楼]   [ 回复时间:2009-02-12 16:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-29 12:37
??真的吗?虽然没有用过vista,这种bug微软是绝对不会犯的吧!
------------------
回复:是的,但不是bug,据说是微软处于安全考虑而特意设计的..
aten
[第16楼]   [ 回复时间:2009-03-21 00:15 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-11 08:43
??真的吗?虽然没有用过vista,这种bug微软是绝对不会犯的吧!
------------------
回复:是的,但不是bug,据说是微软处于安全考虑而特意设计的..
------------------
回复:我用的就VISTA,是可以全屏的!
aten
[第17楼]   [ 回复时间:2009-03-21 00:16 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2008-12-11 08:43
我也是刚做完这实验,学习了!
wangping198611
[第18楼]   [ 回复时间:2009-03-22 20:39 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-03-15 23:05
请问怎么查看效果啊?
wumao110
[第19楼]   [ 回复时间:2009-09-06 16:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-27 01:10
是分三行显示的吗?不是要求在一行上面显示?好像不符合题意!!
zhllhz
[第20楼]   [ 回复时间:2009-12-19 21:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
呵呵 两年了啊 

教材上给了一屏所包含的字节量了 0FA0H

除以2 再减1或加一能屏幕中间位置

但是感觉也不好

还有好的方法吗?

思考中。。
各位学长有好的方法请提示一下
谢谢
关注中。。
ldlihuanfa
[第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,哎,十六进制真晕人啊
imandry
[第22楼]   [ 回复时间:2010-07-18 13:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2010-07-13 10:33
在字符显示系统里面中间就是绝对位置吧

吾的作业
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=32708&kindId=46836&postId=48131&readSg=1
imandry
[第23楼]   [ 回复时间:2010-07-18 13:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2010-07-13 10:33
然后第九章就结束了~~~好开心啊……
jjch224
[第24楼]   [ 回复时间:2010-07-19 10:42 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
顶5楼,我觉得如何找到中间位置是这个程序的侧重点,而我们都忽略了。
till
[第25楼]   [ 回复时间:2010-07-19 11:39 ]   [引用]   [回复]   [ top ] 
荣誉值:3
信誉值:0
注册日期:2008-06-04 16:24
找到中间位置确定偏移地址和颜色属性的配置是解决此题之根本见我的帖子 我已经将这个问题分析的很透彻了 呵呵
http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1010&qkSg=2&qID=51885
ministar
[第26楼]   [ 回复时间:2012-02-01 14:14 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2012-01-03 21:14
所说的滚屏就是比方说每行从开始的在内存单元存入w开始慢慢往后直到最后那个感叹号,是么,

另外就是,那为什么用g指令却可以全部都显示呢??
ministar
[第27楼]   [ 回复时间:2012-02-01 14:16 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2012-01-03 21:14
回复:[第1楼]
------------------
所说的滚屏就是比方说每行从开始的在内存单元存入w开始慢慢往后直到最后那个感叹号,是么, 

另外就是,那为什么用g指令却可以全部都显示呢??
lazdkiy
[第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
hnylcxq
[第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
        
就显示一个颜色吧,好像不用写那么长吧,我这样也能正确显示
gsmc85831
[第30楼]   [ 回复时间:2012-07-30 22:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-07-30 22:40
用g运行就会全部显示了。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved