. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
主题 : :  请问我的实验9程序哪错了,改了一个下午也没改好,显示老是不正常  [待解决] 回复[ 17次 ]   点击[ 530次 ]  
kingsgg
[帖 主] [ 发表时间:2012-03-17 23:06 ] 
荣誉值:4
信誉值:6
注册日期:2012-02-25 16:01
assume cs:code
data segment
      db 'welcome to masm!'
      dw 3 dup (0)
data ends
code segment
start:
      mov ax,data
      mov ds,ax
      mov ss,ax
      mov sp,16h
      mov ax,0b800h
      mov es,ax
      mov bx,0
      mov bp,0
      mov si,6e0h
      mov cx,16
    s:push cx
      mov al,ds:[bx]
      mov ah,02h
      mov es:[si+bp],ax
      add bp,2
      inc bx
      loop s
    
    s0:pop cx
      push cx
      mov bx,0
      mov bp,0
      mov al,ds:[bx]
      mov ah,24h
      mov es:[si+0a0h+bp],ax
      add bp,2
      inc bx
      loop s0

   s1:pop cx
      mov bx,0
      mov bp,0
      mov al,ds:[bx]
      mov ah,71h
      mov es:[si+140h+bp],ax
      add bp,2
      inc bx
      loop s1

      mov ax,4c00h
      int 21h
code ends
end start

编译完后运行,在屏幕中间右边只显示出'welcome'这几个字,然后就是几个小方块,第二行就只有一个绿底的小方块,第三行也是一个白底的小方块.请大大们帮下忙,我到底哪出错了,我的系统是深度技术ghostxp_sp3极速纯净版_2011.12,感激不尽!!
kingsgg
[第8楼] [ 回复时间:2012-03-19 13:19 ] 
荣誉值:4
信誉值:6
注册日期:2012-02-25 16:01
今天我用另一个方法做好了,用了26条指令,对于上面的程序我再详细说一下我的思路,上面的比较复杂,呵呵本来是想用栈来做的,但实验证明我的思路有问题,但不知是哪出错!
assume cs:code  
data segment  
      db 'welcome to masm!'  
data ends 
stack segment 
      dw  8 dup (0)         ;定义栈段,这个不用说了吧
stack ends 
code segment  
start:  
      mov ax,data  
      mov ds,ax               ;定义data段,这个也不用说了吧
      mov ss,stack  
      mov sp,16h                ;定义栈段,这个不用说了吧,指针指向栈顶
      mov ax,0b800h             ;定义显示段
      mov es,ax  
      mov bx,0  
      mov bp,0  
      mov si,7C0h                ;以上定义好需要用的寄存器
      mov cx,16     
    s:push cx                    ;因为要循环3次,将CX的值入栈保存
      push bx                     ;第一次循环后BX的值被改变,也保存BX的值
      push bp                     ;与BX同理
      mov al,ds:[bx]              ;放入DATA段的字节到AL
      mov ah,02h                   ;放入颜色到AH
      mov es:[si+bp],ax           ;将字和颜色放入显示内存
      add bp,2                    ;每次循环+2字节(显示内存)
      inc bx                       ;每次循环+1字节(DATA段)
      loop s  
      
    s0:pop bp       ;出栈,根据后入先出的原理,上一个循环是最后入的是BP,所以先出,恢复BP的值
       pop bx       ;第二个入栈,出栈也是第二个,恢复BX的值
       pop cx        ;第一个入栈,恢复CX的值,循环16次
      push cx        ;将恢复后的CX再入栈,为第三次循环做准备
      push bx        ;将恢复后的BX再入栈,思路同上
      push bp        ;将恢复后的BP入栈,思路同上
      mov al,ds:[bx]      ;将DATA段的字放入AL
      mov ah,24h          ;将颜色放入AH
      mov es:[si+0a0h+bp],ax  ;将字和颜色放入显存
      add bp,2             ;每次循环+2字节,显存段
      inc bx              ;每次循环+1字节,DATA段
      loop s0  

   s1:pop bp              ;恢复BP的值,因第二次循环是最后一个入栈,所以先出
      pop bx              ;恢复BX的值,思路同上
      pop cx               ;恢复CX的值,思路同上
      mov al,ds:[bx]     ;将DATA的字放入AL
      mov ah,71h         ;将颜色放入AH
      mov es:[si+140h+bp],ax  ;将放好的字和颜色的AX放入显存
      add bp,2              ;显存段+2字节
      inc bx                ;DATA段+1字节
      loop s1  

      mov ax,4c00h  
      int 21h  
code ends  
end start 

这个就是我的思路,但不知哪错了,只有第一行显示正常,第二、三行显示不正常,后来再写了一个简单点的,显示正常了,下楼贴出我新写的程序.
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved