. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9,编译通过,单显示会出问题。。。。  [待解决] 回复[ 11次 ]   点击[ 789次 ]  
e56004474
[帖 主]   [ 发表时间:2011-12-14 16:29 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35
为了 方便,我只写了  红底绿字 那段,由于一直有问题,其他还没写。

只显示  “welcome come to masm!“ 颜色为  红底绿字,‘ 01000010b’

assume cs:code , ds:data
data segment
db 'welcome come to masm!'
data ends
code segment
start:   
        mov ax,data
        mov ds,ax              ;  ds=date
        mov ax,0b800h
        mov es,ax              
        mov di,18h
        mov si,0             
        mov ax,0
        mov bx,780h
        mov cx,15h

s:      
        mov al,ds:[si]
        mov ah,01000010b        ; 在显示缓冲区, 显示 红底绿字! 
         mov es:[bx][di],ax                  
        inc si 
        add di,2            
        loop s                
  mov  ax,4c00h 
  int 21
code ends

end start

编译通过,源文件名为 hdlz.txt,生成hdlz.exe后,

在 cmd 下,运行提示 :   
  16位 MS-DOS 子系统(标签)  
  
ntvdm cpu遇到无效指令。
cs:0f76,ip:20d4  OP:63 65 64 20 6b  选择”关闭“ 终止应用程序。


在 command 下,运行显示出来的,但是还多出来其他的东西了。


C:\>hdlz.exe
t).
P  /C string       Carries out the command specified by string, and then sto
N  /MSG

            welcome come to masm!


===============================================================================

源程序中  ”welcome come to masm!“ 改为  ‘welcome to masm!’


源程序中有什么 主要问题么?  
不知道是不 这条有问题?  mov es:[bx][di],ax
debug 时,ES复制到内存单元,显示的不是  AX 要被复制的 数据。。。
tomato
[第1楼]   [ 回复时间:2011-12-14 22:38 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
程序是对的,没问题的。 mov es:[bx][di],ax 这条指令是正确的。
e56004474
[第2楼]   [ 回复时间:2011-12-30 09:51 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35
12章之后看了挺吃力的,回过来再复习基础下。。。 
 
这问题我再想想。
tomato
[第3楼]   [ 回复时间:2011-12-30 22:15 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
确实,温故而知新。
e56004474
[第4楼]   [ 回复时间:2011-12-31 21:48 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35
mov cx,15h    ;cx=21D      这条不对。
  mov di,18h    ;列,会显示 不对了。 
  mov  ax,4c00h  
  int 21        ;这条不对,  正确为  int 21h

今天在360上随便下了个编译器,在软件上 单埗的时候, 执行  'int 21' 这条指令提示‘cpu遇到无效指令。……’这个问题。  改了后,就没问题了。。
e56004474
[第5楼]   [ 回复时间:2011-12-31 21:55 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35
ASSUME    CS:CODE , DS:DATA

        DATA  SEGMENT
              DB        'welcome to masm!'
        DATA  ENDS


;00000010  绿字。。
;00100100  绿底红字。
;01110010  白底蓝字。


        CODE  SEGMENT
      START:
              MOV       AX,DATA
              MOV       DS,AX       ;  ds=date

              MOV       AX,0B800H
              MOV       ES,AX
        
              MOV       SI,0
              MOV       DI,40H
                    
              MOV       AX,0
              MOV       BX,1920D    ;第12行.................
              MOV       CX,10H

          S:
              MOV       AL,DS:[SI]
              MOV       AH,00000010B            ; 在显示缓冲区, 显示 绿字!
              MOV       ES:[BX][DI],AX
              INC       SI
              ADD       DI,2
              LOOP      S
              
              MOV       SI,0
              MOV       DI,40H
                    
              MOV       AX,0
              ADD       BX,0A0H     ;第13行
              MOV       CX,10H

         S1:
              MOV       AL,DS:[SI]
              MOV       AH,00100100B            ; 在显示缓冲区,绿底红字。
              MOV       ES:[BX][DI],AX
              INC       SI
              ADD       DI,2
              LOOP      S1


              MOV       SI,0
              MOV       DI,40H
                    
              MOV       AX,0
              ADD       BX,0A0H     ;第14行
              MOV       CX,10H

         S2:
              MOV       AL,DS:[SI]
              MOV       AH,01110010B            ; 在显示缓冲区,白底蓝字。
              MOV       ES:[BX][DI],AX
              INC       SI
              ADD       DI,2
              LOOP      S2

              MOV       AX,4C00H
              INT       21H
        CODE  ENDS

              END       START

;正常显示了。  行,列问题挺纠结的。  行780h,不会转换,软件单步看的reg。   弄了2个小时左右,调调试试,总算弄出满意的效果了。  至于 代码效率问题,暂时不考虑了,以后再来  改进。
;有不对的地方,还请多多指正 ^-^.
e56004474
[第6楼]   [ 回复时间:2012-01-09 00:27 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35
ASSUME    CS:CODE , DS:DATA

        DATA  SEGMENT
              DB        'welcome to masm!',0
        DATA  ENDS


;00000010  绿字。。 
;00100100  绿底红字。 
;01110010  白底蓝字。 


        CODE  SEGMENT
      START:
              MOV       AX,DATA
              MOV       DS,AX       ;  ds=date
              MOV       CX,0        ; 默认CX= 程序的长度。

              MOV       DH,13D      ; 13行
              MOV       DL,32D      ; 32列
              MOV       CL,00000010B            ; 绿字
              CALL      SHOW_STR
              
              ADD       DH,1        ; 14行
              MOV       CL,00100100B            ;颜色,列不变
              CALL      SHOW_STR
              
              ADD       DH,1        ;15行
              MOV       CL,01110010B            ;颜色,列不变
              CALL      SHOW_STR
              MOV       AX,4C00H
        
              INT       21H


;;;;;;;;;;;;;;;;;;;子程序show_str;;;;;;;;;;;;;;;;;;;;;;
;dh-行,dl=列,cl=颜色.
;显示以0结尾的字符串


   SHOW_STR:
              PUSH      SI          ;?        可省掉

              PUSH      BX          ;! 不可省
              PUSH      DX
              PUSH      CX
              PUSH      AX
              
              MOV       AX,0B800H
              MOV       ES,AX
        
              MOV       BX,0        ;最好不省
              MOV       AX,0

              MOV       AL,2
              MUL       DL
              MOV       DI,AX       ;列
                
              MOV       AL,160D
              MUL       DH
              MOV       BX,AX       ;行
              MOV       AH,CL       ;颜色
              MOV       CH,0

         S0:

              MOV       AL,[SI]
              MOV       CL,AL
             
              JCXZ      S1
              
              MOV       ES:[BX][DI],AX
              INC       SI
              ADD       DI,2
              JMP       SHORT  S0

         S1:
              POP       AX
              POP       CX
              POP       DX
              POP       BX
              POP       SI
              RET


;;;;;;;;;;;;;;;;;;;;;;;;子程序结尾;;;;;;;;;;;;;;;;;;;;;;;;;;;


        CODE  ENDS
              END       START
e56004474
[第7楼]   [ 回复时间:2012-01-09 00:30 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35
后面要用到,写了遍。  写出来不容易。。。。  掉这掉那的,只好一步一步T。。。

一次次纠正,好费时间呐。。。
chinatree
[第8楼]   [ 回复时间:2012-01-09 02:04 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
但是难道说你没有学到什么吗?调试也是一门功夫.
tomato
[第9楼]   [ 回复时间:2012-01-09 21:54 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
说明功力还不够。
e56004474
[第10楼]   [ 回复时间:2012-03-15 13:03 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35
最讨厌的就是,T进循环里去,且循环里会出错的时候,最麻烦。

学到了,有些不明白的, 到时候T 进去,就明白了。

功力不够,可以慢慢来。。。   不鼓励下也就算了,我容易么 o(︶︿︶)o 唉
tomato
[第11楼]   [ 回复时间:2012-03-15 23:43 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
回复10楼:误会我的意思了,呵呵!鼓励鼓励!加油哦!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved