沉ジ寞 发表于 2014-4-8 19:41:20

实验九 看不懂啊。。。

本帖最后由 沉ジ寞 于 2014-4-9 08:53 编辑

       从昨晚开始研究,今天又研究了一天,实在做不出来正确的,就看了小甲鱼的视频 看了三遍,还是不懂!又研究了 王爽 《汇编语言》第二版 习题答案   最后做出来了,但是问题很大原程序都能 编译成功 却看不到变色的字母,好纠结啊
还有:你们在实验九都研究多长时间做出来的啊 觉得自己好笨的说。。。

这是我的程序:
assume cs:code
a segment
db 'Welcome to masm!'
a ends
b segment
dw 4000 dup (0)
b ends
code segment
start:
mov ax,a
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov si,0
mov cx,16
s0:mov ax,
   mov es:,ax
   mov al,2h
   mov es:,al
inc bx
inc si
loop s0
mov bx,0
mov cx,10h
mov si,0a0h
s1:mov ax,
   mov es:,ax
   mov al,24h
   mov es:,al
inc bx
inc si
loop s1
mov bx,0
mov si,140h
mov cx,10h
s2:mov ax,
   mov es:,ax
   mov al,71h
   mov es:,al
inc bx
inc si
loop s2

   mov ax,4c00h
   int 21h
code ends
end start




今天早上用了小甲鱼老师的代码,也是出不来彩色的字符。编译完成后 难道不是直接运行吗?



cqxcool 发表于 2014-4-8 20:16:05


不知道 你是不是要这种效果。
你的代码有两个问题
1、b segment 少了b ends
2、inc si 这个地方有点问题。显存中ascii字符占一个字节,颜色属性占一个字节,所以si应该是偏移两个字节。inc si改成add si,2

沉ジ寞 发表于 2014-4-8 20:23:59

cqxcool 发表于 2014-4-8 20:16 static/image/common/back.gif
不知道 你是不是要这种效果。
你的代码有两个问题
1、b segment 少了b ends


我把你说的都改了,还是出不来啊

cqxcool 发表于 2014-4-8 20:37:12

沉ジ寞 发表于 2014-4-8 20:23 static/image/common/back.gif
我把你说的都改了,还是出不来啊

你用的是xp系统吗

沉ジ寞 发表于 2014-4-8 20:49:11

cqxcool 发表于 2014-4-8 20:37 static/image/common/back.gif
你用的是xp系统吗

win7 32位的                  

cqxcool 发表于 2014-4-8 20:54:09

沉ジ寞 发表于 2014-4-8 20:49 static/image/common/back.gif
win7 32位的

虚拟机装个xp吧

沉ジ寞 发表于 2014-4-8 21:07:09

cqxcool 发表于 2014-4-8 20:54 static/image/common/back.gif
虚拟机装个xp吧

....................这个跟系统没啥关系吧

swsm 发表于 2014-4-8 22:54:52

你debug 调试的时候输入g命令,试一下!!!

青玄 发表于 2014-4-10 12:46:00

嗯...,我的也是WIN7的,也显示不出来,我做的时候都是在XP下做的,我想这和DOS的版本有关系吧!WIN7上的DOS一般是6.0的版本,而XP下的DOS是5.1的版本,要不然的话就是系统本身的问题;你试着在虚拟机里装一个XP的,再在里面运行一下就可以了,还有一种方法就是砸纯DOS模式下,运行也是可以的!

青玄 发表于 2014-4-10 12:46:09

嗯...,我的也是WIN7的,也显示不出来,我做的时候都是在XP下做的,我想这和DOS的版本有关系吧!WIN7上的DOS一般是6.0的版本,而XP下的DOS是5.1的版本,要不然的话就是系统本身的问题;你试着在虚拟机里装一个XP的,再在里面运行一下就可以了,还有一种方法就是砸纯DOS模式下,运行也是可以的!

沉ジ寞 发表于 2014-4-10 13:56:42

青玄 发表于 2014-4-10 12:46 static/image/common/back.gif
嗯...,我的也是WIN7的,也显示不出来,我做的时候都是在XP下做的,我想这和DOS的版本有关系吧!WIN7上的DO ...

为了这个去装虚拟机有点小题大做了,我装了一个dosbox

青玄 发表于 2014-4-10 14:02:16

沉ジ寞 发表于 2014-4-10 13:56 static/image/common/back.gif
为了这个去装虚拟机有点小题大做了,我装了一个dosbox

嗯!dosbox也可以!

苏门答腊鸭 发表于 2014-4-10 14:44:51

本帖最后由 苏门答腊鸭 于 2014-4-10 14:46 编辑

看看这个两个循环的版本能看懂不,我已经把注释写的很详细了
http://bbs.fishc.com/forum.php?mod=attachment&aid=MjMzODd8NTRjYjgyMDJ8MTM5NzExMjMxM3wyODE2NzF8NDU3MzQ%3D&noupdate=yes
assume cs:code,ds:data,ss:stack

data segment
      db 'welcome to masm!'                ;数据段定义目标字符串
      db02h,24h,71h                        ;定义颜色代码
data ends

stack segment
      dw 8 dup(0)                        ;定义一个空堆栈,用来存放不希望被内部循环修改的一些变量
stack ends

code segment

start:      
      mov ax,data                        ;data挂钩数据段
      mov ds,ax
      mov ax,stack
      mov ss,ax                        ;stack挂钩栈段
      mov sp,10h                        ;初始化栈顶指针地址
      mov ax,0b872h                        ;定义字符串首字符地址,这里是为了美观,定义到了屏幕居中位置
      
      mov cx,3                        ;定义外部大循环计数器3次
      mov di,10h                        ;由于目标字符串长度16位(0--15),所以后边颜色代码从第16位开始 10H
      
s0:      mov es,ax                        ;外层循环:将要修改的显存区域与es挂钩
      mov bx,0                        ;将要用到的‘变量’寄存器预先清零
      mov si,0
               
      push ax                              ;将预显示字符串首字符地址压栈保存,以免在内层循环中ax的值被修改
      push cx                              ;将外层循环次数压栈保存
      
      mov cx,16                        ;由于目标字符串长度16位,所以设置内部循环次数为16次
               
s1:      mov al,ds:                        ;内部循环:将首字符赋予al,由于1个字符占一个字节,所以这里用al
      mov es:,al                        ;将al的值赋予es:0位置,也就是0b872:0位置,显示第一个字符
      mov al,ds:                        ;将颜色代码值赋予al
      mov es:,al                ;基地址存放颜色代码,所以将si+1,将al的值赋予es:01位置,也就是0b872:01处,以显示文字颜色
      add si,2                        ;由于偶地址放字符,基地址放颜色代码,所以这里将si+2,以便指向下一个字符地址
      inc bx                              ;bx索引数据段中字符串的字符,所以每次循环自增1
loop s1                                        ;循环s1,以显示第一行整个字符串中的所有字符

      inc di                              ;内循环结束后第一行字符串显示完毕进入外部循环,将索引颜色代码字符地址的di自增1以设置第二行字符串颜色
      pop cx                              ;将与现存的外循环次数出栈
      pop ax                              ;将预先保存的第一行首字符地址出栈
      add ax,0ah                        ;将第一行首字符地址+160以指向第二行首字符地址
      
loop s0                                        ;大循环3次,显示3行字符串
      
      mov ax,4c00h                        ;大循环完毕后程序结束
      int 21h
code ends
end start

黄种人 发表于 2014-6-27 14:35:17

记得去年我学的时候刚开始也是没法出彩色的字符,后来发现是存储颜色的寄存器地址偏移量弄错了,修改后就可以出彩色了,我的也是win7系统

↘_vIp`|家族_流 发表于 2014-7-6 10:55:15

我也是初学者,说的不对楼主别喷:首先你定义的是字节型,但是第一个循环的mov ax,是十六位寄存器,存储一个字,以此转移两个字节,会把字符的属性覆盖,然后你得si是偏移属性的(对吧),每次自增一岂不是把字符覆盖了?建议是si和bx加2


不知道对不对,说错了别见怪

↘_vIp`|家族_流 发表于 2014-7-6 10:56:51

↘_vIp`|家族_流 发表于 2014-7-6 10:55
我也是初学者,说的不对楼主别喷:首先你定义的是字节型,但是第一个循环的mov ax,是十六位寄存器,存储一 ...

我昨天刚做出来,做了一天,源码很简单,需要的话可以共享一下
页: [1]
查看完整版本: 实验九 看不懂啊。。。