鱼C论坛

 找回密码
 立即注册
查看: 2145|回复: 15

实验九 看不懂啊。。。

[复制链接]
发表于 2014-4-8 19:41:20 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 沉ジ寞 于 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,[bx]
   mov es:[720h+si],ax
   mov al,2h
   mov es:[721h+si],al
inc bx
inc si
loop s0
mov bx,0
mov cx,10h
mov si,0a0h
s1:mov ax,[bx]
   mov es:[720+si],ax
   mov al,24h
   mov es:[721+si],al
inc bx
inc si
loop s1
mov bx,0
mov si,140h
mov cx,10h
s2:mov ax,[bx]
   mov es:[720+si],ax
   mov al,71h
   mov es:[721+si],al
inc bx
inc si
loop s2
  
   mov ax,4c00h
   int 21h
code ends
end start


TT截图未命名.jpg

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



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-8 20:16:05 | 显示全部楼层
QQ截图20140408201147.png
不知道 你是不是要这种效果。
你的代码有两个问题
1、b segment 少了b ends
2、inc si 这个地方有点问题。显存中ascii字符占一个字节,颜色属性占一个字节,所以si应该是偏移两个字节。inc si改成add si,2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-8 20:23:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-8 20:37:12 | 显示全部楼层
沉ジ寞 发表于 2014-4-8 20:23
我把你说的都改了,还是出不来啊

你用的是xp系统吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-8 20:49:11 | 显示全部楼层
cqxcool 发表于 2014-4-8 20:37
你用的是xp系统吗

win7 32位的                  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-8 20:54:09 | 显示全部楼层

虚拟机装个xp吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-8 21:07:09 | 显示全部楼层
cqxcool 发表于 2014-4-8 20:54
虚拟机装个xp吧

....................这个跟系统没啥关系吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-8 22:54:52 | 显示全部楼层
你debug 调试的时候输入g命令,试一下!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-10 12:46:00 | 显示全部楼层
嗯...,我的也是WIN7的,也显示不出来,我做的时候都是在XP下做的,我想这和DOS的版本有关系吧!WIN7上的DOS一般是6.0的版本,而XP下的DOS是5.1的版本,要不然的话就是系统本身的问题;你试着在虚拟机里装一个XP的,再在里面运行一下就可以了,还有一种方法就是砸纯DOS模式下,运行也是可以的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-10 12:46:09 | 显示全部楼层
嗯...,我的也是WIN7的,也显示不出来,我做的时候都是在XP下做的,我想这和DOS的版本有关系吧!WIN7上的DOS一般是6.0的版本,而XP下的DOS是5.1的版本,要不然的话就是系统本身的问题;你试着在虚拟机里装一个XP的,再在里面运行一下就可以了,还有一种方法就是砸纯DOS模式下,运行也是可以的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-10 13:56:42 | 显示全部楼层
青玄 发表于 2014-4-10 12:46
嗯...,我的也是WIN7的,也显示不出来,我做的时候都是在XP下做的,我想这和DOS的版本有关系吧!WIN7上的DO ...

为了这个去装虚拟机  有点小题大做了  ,我装了一个dosbox
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-10 14:02:16 | 显示全部楼层
沉ジ寞 发表于 2014-4-10 13:56
为了这个去装虚拟机  有点小题大做了  ,我装了一个dosbox

嗯!dosbox也可以!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-10 14:44:51 | 显示全部楼层
本帖最后由 苏门答腊鸭 于 2014-4-10 14:46 编辑

看看这个两个循环的版本能看懂不,我已经把注释写的很详细了

                               
登录/注册后可看大图
assume cs:code,ds:data,ss:stack

data segment
        db 'welcome to masm!'                ;数据段定义目标字符串
        db  02h,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:[bx]                        ;内部循环:将首字符赋予al,由于1个字符占一个字节,所以这里用al
        mov es:[si],al                        ;将al的值赋予es:0位置,也就是0b872:0位置,显示第一个字符
        mov al,ds:[di]                        ;将颜色代码值赋予al
        mov es:[si+1],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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-27 14:35:17 | 显示全部楼层
记得去年我学的时候刚开始也是没法出彩色的字符,后来发现是存储颜色的寄存器地址偏移量弄错了,修改后就可以出彩色了,我的也是win7系统
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


不知道对不对,说错了别见怪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

我昨天刚做出来,做了一天,源码很简单,需要的话可以共享一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 04:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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