鱼C论坛

 找回密码
 立即注册
查看: 1997|回复: 3

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

[复制链接]
发表于 2012-11-30 16:05:59 | 显示全部楼层 |阅读模式
5鱼币
下面是我的代码 请高手指导一下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,[bx]
                       mov byte ptr es:[si],al
                           inc bx
                           add si,2
                           loop s0      ;此循环实现es段偶偏移地址中存放字符
                          
                   mov si,1
                   mov cx,16
                   s1: mov bx,dx
                       mov al,[bx+15]
                           mov byte ptr es:[si],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:[si],al指令 来实现对b872基址内存进行修改  

最佳答案

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-30 16:06:00 | 显示全部楼层
  1. data segment
  2.    db 'Welcome to masm!'
  3.    db 71h,24h,02h
  4. data ends

  5. code segment
  6.      start:            mov ax,data
  7.                                    mov ds,ax
  8.                   
  9.                    mov ax,0b872h
  10.                    mov es,ax
  11.                                    mov bx,0 ;使用BX来定义目标行,每循环一次加16字节
  12.                                    mov bp,0 ;索引颜色,因为每一行颜色是相同的,故单独放一个寄存器中
  13.                                   
  14.                    mov cx,3
  15.                 s: mov dx,cx ;将CX行循环数存入BX中,以备后面提取,建议楼使用栈来存放,以方便后面章节中对栈深入理解
  16.                    mov si,0 ;索引原数据列
  17.                                    mov di,0 ;索引目标数据列,建议使用DI,避免代码过多时眼花缭乱
  18.                                   
  19.                                    mov cx,10h
  20.                 s0:mov al,ds:[si]
  21.                    mov byte ptr es:[bx+di],al
  22.                    inc si
  23.                    add di,2
  24.                    loop s0      ;此循环实现es段偶偏移地址中存放字符
  25.                   
  26.                                   
  27.                                    mov di,1
  28.                    mov cx,10h
  29.                 s1:;不明白楼主此指令作何用 mov bx,dx
  30.                    mov al,ds:10h[bp] ;将颜色属性送入AL
  31.                    mov byte ptr es:[bx+di],al
  32.                    add di,2
  33.                    loop s1     ;此循环实现es段奇偏移地址中存放属性
  34.                     
  35.                                    inc bp
  36.                    mov cx,dx       ;恢复外循环cx值
  37.                    ;mov ax,es
  38.                    add bx,0a0h      ;段地址向下移一行     
  39.                    ;mov es,ax
  40.                    loop s
  41.                   
  42.                    mov ax,4c00h
  43.                    int 21h
  44. code ends
  45. end start

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

  47. ;自己调试了很多遍,发现没法利用 mov es:[si],al指令 来实现对b872基址内存进行修改  
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-3 20:19:40 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-4 10:13:48 | 显示全部楼层
wawa 发表于 2012-12-3 20:19
非常感谢,非常感谢

共同学习,共同进步
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 03:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表