wawa 发表于 2012-11-30 16:05:59

实验9自己编写的代码没法实现屏幕字符

下面是我的代码 请高手指导一下assume cs:code,ds:data

data segment
   db 'welcome to masm!'
   db 71h,24h,02h
data ends

code segment
   start: mov ax,data
             mov ds,ax
                  
                   mov ax,0b872h
                   mov es,ax
                  
                   mov cx,3
                s: mov si,0
                   mov bx,0
                   mov dx,cx
                  
                   mov cx,16
                   s0: mov al,
                     mov byte ptr es:,al
                           inc bx
                           add si,2
                           loop s0      ;此循环实现es段偶偏移地址中存放字符
                          
                   mov si,1
                   mov cx,16
                   s1: mov bx,dx
                     mov al,
                           mov byte ptr es:,al
                           add si,2
                           loop s1   ;此循环实现es段奇偏移地址中存放属性
                       
                   mov cx,dx       ;恢复外循环cx值
                   mov ax,es
                   add ax,16      ;段地址向下移一行   
                   mov es,ax
                   loop s
                  
                   mov ax,4c00h
                   int 21h
code ends
end start


自己调试了很多遍,发现没法利用 mov es:,al指令 来实现对b872基址内存进行修改

lyoal 发表于 2012-11-30 16:06:00

data segment
   db 'Welcome to masm!'
   db 71h,24h,02h
data ends

code segment
   start:            mov ax,data
                                   mov ds,ax
                  
                   mov ax,0b872h
                   mov es,ax
                                   mov bx,0 ;使用BX来定义目标行,每循环一次加16字节
                                   mov bp,0 ;索引颜色,因为每一行颜色是相同的,故单独放一个寄存器中
                                  
                   mov cx,3
                s: mov dx,cx ;将CX行循环数存入BX中,以备后面提取,建议楼使用栈来存放,以方便后面章节中对栈深入理解
                   mov si,0 ;索引原数据列
                                   mov di,0 ;索引目标数据列,建议使用DI,避免代码过多时眼花缭乱
                                  
                                   mov cx,10h
                s0:mov al,ds:
                   mov byte ptr es:,al
                   inc si
                   add di,2
                   loop s0      ;此循环实现es段偶偏移地址中存放字符
                  
                                  
                                   mov di,1
                   mov cx,10h
                s1:;不明白楼主此指令作何用 mov bx,dx
                   mov al,ds:10h ;将颜色属性送入AL
                   mov byte ptr es:,al
                   add di,2
                   loop s1   ;此循环实现es段奇偏移地址中存放属性
                  
                                   inc bp
                   mov cx,dx       ;恢复外循环cx值
                   ;mov ax,es
                   add bx,0a0h      ;段地址向下移一行   
                   ;mov es,ax
                   loop s
                  
                   mov ax,4c00h
                   int 21h
code ends
end start

;这一段代码下来,寄存器快用光了,如果是大段代码就不够用,所以栈是最好的选择。

;自己调试了很多遍,发现没法利用 mov es:,al指令 来实现对b872基址内存进行修改

wawa 发表于 2012-12-3 20:19:40

lyoal 发表于 2012-11-30 16:06 static/image/common/back.gif


非常感谢,非常感谢

lyoal 发表于 2012-12-4 10:13:48

wawa 发表于 2012-12-3 20:19 static/image/common/back.gif
非常感谢,非常感谢

共同学习,共同进步
页: [1]
查看完整版本: 实验9自己编写的代码没法实现屏幕字符