+ -
当前位置:首页 → 问答吧 → 大家好,又是我.....

大家好,又是我.....

时间:2011-03-17

来源:互联网

没办法,调试到的结果没遇到过,度娘有不清不楚的,只好问你们了,是在运行command里面运行的

Assembly code
assume cs:code,ds:data

data segment

        db 'welcome to masm!'

data ends

code segment

start:mov ax,data
      mov ds,ax
      mov bx,0

      mov ax,0B800h
      mov es,ax
      mov di,0
     

      mov ax,4c00h
      int 21h    


code ends

end start




能link出exe来,但是当debug到mov di,0时,有问题,指令变为stosb还是啥的,我把di换成si就没问题了,求解

作者: A328240784   发布时间: 2011-03-17

。。。。不是,这个没问题,但是我一整段代码弄上去就有问题了

Assembly code
assume cs:code,ds:data

data segment

        db 'welcome to masm!'

data ends

code segment
;该代码主要是把data的字符串弄上显示缓冲区里,写在中间,要三行,还要不同颜色之类的
start:mov ax,data
      mov ds,ax
      mov bx,0

      mov ax,0B800h  ;显示缓冲区
      mov ss,ax
      mov si,0
      mov bp,0

      mov cx,3
      mov ax,0020h;某颜色属性的数据
      mov es,ax
      mov es:[0],cx
;没写完,想先调试下
    s:mov cx,16
      mov al,[bx]
      mov [bp+si+64],al;显示器中间偏左开始写
      mov al,02h
      mov [bp+si+65],al
      inc bx
      add si,2
      loop s
      mov cx,es:[0]
      add bp,160
    

      mov ax,4c00h
      int 21h    


code ends

end start









作者: A328240784   发布时间: 2011-03-17

因为注释是临时打上去方便大家看的,所以打错冒号了= =

作者: A328240784   发布时间: 2011-03-17

先说明一下
 mov ax,0B800h ;显示缓冲区
 mov ss,ax

用ss做显示缓冲区的段地址不好,尽管你没有进行入栈操作,但有没有类似call等隐式入栈呢?若有,就把显示内容破坏了。

作者: shzhfu   发布时间: 2011-03-17

在尽量没改变你的风格的基础上,做了些修改,已调试通过。
Assembly code

assume cs:code,ds:data

data segment

        db 'welcome to masm!'

data ends

code segment
;该代码主要是把data的字符串弄上显示缓冲区里,写在中间,要三行,还要不同颜色之类的
start:mov ax,data
      mov es,ax     ;原数据段用es,留下ds给显示缓冲
      mov di,0

      mov ax,0B800h  ;显示缓冲区
      mov ds,ax        ;用ds段寄存器
      mov si,0
      mov bx,0

;      mov cx,3
      mov ax,0020h ;某颜色属性的数据
;      mov es,ax
;      mov es:[0],cx
    push cx        ;保存cx的操作可以用入栈
;没写完,想先调试下
    mov cx,16        ;循环不能返回这里,那样是死循环
    s: mov al,es:[di]
      mov [bx+si+64],al ;显示器中间偏左开始写 
        ; 把原来以bp为基址的基址+变址相对寻址方式换成以bx为基址
      mov al,02h
      mov [bx+si+65],al
      inc di
      add si,2
      loop s
;      mov cx,es:[0]    ;恢复cx就对应的是出栈
    pop    cx
      add bx,160
    

      mov ax,4c00h
      int 21h    


code ends

end start

作者: shzhfu   发布时间: 2011-03-17