赣之川 发表于 2012-2-25 12:15:35

实验十第一题,运行起来怎么没有在dos提示终端显示出来啊

实验十第一题,运行起来怎么没有在dos提示终端显示出来啊
我实验了好多遍,而且调试的时候发现在在显存中并没有写入要显示的字符和其属性,这是为什么呢,求哪位大侠告诉我啥。我的代码如下:assume cs:code

data segment
db 'Welcome to masm!',0
data ends

code segment
start:
      mov dh,8
          mov dl,3
          mov cl,2
          
          mov ax,data
          mov ds,ax
          mov si,0
          call show_str
          
          
          mov ax,4c00h
          int 21h
          
show_str:
      push cx
                push si
                dec dh
                mov al,0A0h ;一行2*80=160字节
                mul dh
               
                mov bx,ax ;保存行偏移地址
                mov al,2;一个字符两个字节
                mul dl
                sub ax,2
               
                add bx,ax
                mov ax,0B800h
                mov es,ax
               
                mov al,cl ;保存字符属性值
                mov di,0;指向显存的偏移地址
                mov ch,0
        s:        mov cl,ds:
               
                jcxz ok
                mov es:,cl
                mov es:,al
               
                inc si
                add di,2
                jmp short s
ok:
    pop si
        pop cx
        ret
               
               
code ends
end start

赣之川 发表于 2012-2-25 12:16:09

:(:(:(:(,自己先顶一下

赣之川 发表于 2012-2-25 12:50:28

知道原因了,不好意思,原来是因为windows7上的dos终端显示不了:lol:lol:lol:lol:lol:lol:lol

风剑河 发表于 2012-2-25 13:30:19

值得顶一下,你的程序没有错误,执行得非常好!
在文件夹内直接输入***.exe就行了
之所以你说没有在dos提示终端显示出来,是因为你一直在单步运行的原因。
例如:当ip指向代码“mov es:,cl”时,你摁“t”单步执行
我们来看CPU执行过程:读取指令“mov es:,cl”,ip=ip+3,执行指令“mov es:,cl”,然后 es:中的值变成了cl中的值,这是肯定的。但关键是下一步,你会说CPU下一步该读取执行你的“es:,al”指令,但其实不是,CPU下一步真正执行的是你按的“T”命令的后续内容——显示当前各寄存器状态、显示下一条指令的内容,屏幕上的原字符往上移动……,可以说整屏的显存中数据都做了变动了。所以你再用D命令查看显存,就看不到你之前赋的CL的值,而是D命令执行前屏幕上的字符属性,每次用D查看显存,都会看到它代表字符的单元都在变化,只有代表颜色属性的单元始终是“07”,也就是黑底白字。

以上都是经过试验和思考得出的个人结论,若有错误的地方,请高手们一定要指出来啊!!
页: [1]
查看完整版本: 实验十第一题,运行起来怎么没有在dos提示终端显示出来啊