实验九 看不懂啊。。。
本帖最后由 沉ジ寞 于 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
今天早上用了小甲鱼老师的代码,也是出不来彩色的字符。编译完成后 难道不是直接运行吗?
不知道 你是不是要这种效果。
你的代码有两个问题
1、b segment 少了b ends
2、inc si 这个地方有点问题。显存中ascii字符占一个字节,颜色属性占一个字节,所以si应该是偏移两个字节。inc si改成add si,2 cqxcool 发表于 2014-4-8 20:16 static/image/common/back.gif
不知道 你是不是要这种效果。
你的代码有两个问题
1、b segment 少了b ends
我把你说的都改了,还是出不来啊 沉ジ寞 发表于 2014-4-8 20:23 static/image/common/back.gif
我把你说的都改了,还是出不来啊
你用的是xp系统吗
cqxcool 发表于 2014-4-8 20:37 static/image/common/back.gif
你用的是xp系统吗
win7 32位的 沉ジ寞 发表于 2014-4-8 20:49 static/image/common/back.gif
win7 32位的
虚拟机装个xp吧 cqxcool 发表于 2014-4-8 20:54 static/image/common/back.gif
虚拟机装个xp吧
....................这个跟系统没啥关系吧 你debug 调试的时候输入g命令,试一下!!! 嗯...,我的也是WIN7的,也显示不出来,我做的时候都是在XP下做的,我想这和DOS的版本有关系吧!WIN7上的DOS一般是6.0的版本,而XP下的DOS是5.1的版本,要不然的话就是系统本身的问题;你试着在虚拟机里装一个XP的,再在里面运行一下就可以了,还有一种方法就是砸纯DOS模式下,运行也是可以的! 嗯...,我的也是WIN7的,也显示不出来,我做的时候都是在XP下做的,我想这和DOS的版本有关系吧!WIN7上的DOS一般是6.0的版本,而XP下的DOS是5.1的版本,要不然的话就是系统本身的问题;你试着在虚拟机里装一个XP的,再在里面运行一下就可以了,还有一种方法就是砸纯DOS模式下,运行也是可以的! 青玄 发表于 2014-4-10 12:46 static/image/common/back.gif
嗯...,我的也是WIN7的,也显示不出来,我做的时候都是在XP下做的,我想这和DOS的版本有关系吧!WIN7上的DO ...
为了这个去装虚拟机有点小题大做了,我装了一个dosbox 沉ジ寞 发表于 2014-4-10 13:56 static/image/common/back.gif
为了这个去装虚拟机有点小题大做了,我装了一个dosbox
嗯!dosbox也可以! 本帖最后由 苏门答腊鸭 于 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
记得去年我学的时候刚开始也是没法出彩色的字符,后来发现是存储颜色的寄存器地址偏移量弄错了,修改后就可以出彩色了,我的也是win7系统 我也是初学者,说的不对楼主别喷:首先你定义的是字节型,但是第一个循环的mov ax,是十六位寄存器,存储一个字,以此转移两个字节,会把字符的属性覆盖,然后你得si是偏移属性的(对吧),每次自增一岂不是把字符覆盖了?建议是si和bx加2
不知道对不对,说错了别见怪 ↘_vIp`|家族_流 发表于 2014-7-6 10:55
我也是初学者,说的不对楼主别喷:首先你定义的是字节型,但是第一个循环的mov ax,是十六位寄存器,存储一 ...
我昨天刚做出来,做了一天,源码很简单,需要的话可以共享一下
页:
[1]