当前位置: 代码迷 >> 汇编语言 >> 王爽编译语言 实验9的代码
  详细解决方案

王爽编译语言 实验9的代码

热度:8080   发布时间:2013-02-26 00:00:00.0
王爽汇编语言 实验9的代码~
哪位高手来帮忙看一下。 在彩色缓冲区显示相应的字符串。

assume cs:code

data segment

  db 'Welcome to masm!'
  db 02h,011h,024h,011h,01h,011h,00h,01h

data ends

code segment

start: mov ax,0b800h
  mov es,ax
  mov di,07cfh

  mov ax,data
  mov ds,ax
  mov bx,0h
  mov cx,10h
  mov si,10h
   
s: mov al,[bx]
  mov ah,[si]
  mov es:[di],ax
  add di,02h
  inc bx
  loop s
  mov bx,0h
  mov ch,0h
  mov cl,[si+1]
  add si,02h
  loop s

  mov ax,4c00h
  int 21h
code ends

end start
这个运行后在屏幕上没效果。不知道问题出在哪里。

------解决方案--------------------------------------------------------
问题大大的有,首先理一下你的思路:

[si] 指向源字符串,16个字节;

es:[di]指向目标地址,LZ在这里最好用公式:m*100h+n*2,增加易读性,由公式得目标地址必然是偶数。问题一也;

循环嵌套,在进入内层循环之前要把外层循环的cx值保存起来,可保存在寄存器里,也可保存在内存里,实模式编程一般用寄存器保存,然后内层循环结束之后再释放cx值,以保证外层循环的正确,你这个嵌套循环是无法显示的核心问题;

网上有第二版的答案,LZ可以去网上搜搜,找不到的话也可以跟我要。
------解决方案--------------------------------------------------------
说实话,看懂LZ没有注释的代码还真的有点费劲
前半边我给改好了,能够显示

后面几句话我实在不懂啥意思了,就没改了

指出一个比较严重的问题把
LZ 的 ES:DI,一开始指向的是 0B800:07CF,
07CF是 1999,而不是2000

而偶数位置才是能够显示字符的区域,奇数位才是颜色区,我想LZ给弄反了
下面是我调通了的代码

希望对你有帮助
Assembly code
assume cs:codedata segment  db 'Welcome to masm!'  db 02h,011h,024h,011h,01h,011h,00h,01hdata endscode segmentstart:     mov ax,0b800h              mov es,ax              mov di,2000            ;     screen's middle,instead of 1999,but 2000              mov ax,data              mov ds,ax                            mov bx,0h                ;    bx ptr to CHAR              mov si,10h            ;    si ptr to COLOR              mov cx,10h                s:             mov al,[bx]              mov ah,[si]              mov es:[di],ax    ;    mov CHAR(al) & COLOR(ah)              add di,02h              inc bx                loop s                                mov bx,0  mov ax,4c00h  int 21hcode endsend start
  相关解决方案