鱼C论坛

 找回密码
 立即注册
查看: 3789|回复: 13

[汇编作业] 王爽汇编第九章实验9

[复制链接]
发表于 2014-4-18 18:04:55 | 显示全部楼层 |阅读模式
7鱼币
连续输出3行字符试了几次都做不到,所以写了输出一行字符的。但是编译失败提示什么溢出

assume  cs:code,ds:data
data segment

     db 'welcome to masm!'
     db '2h,24h,71h'    \颜色的值\

data ends

code segment

start:   

     mov ax,data
     mov ds,ax         

     mov ax,0b800h   \第一个要输出字符的地址\
     mov ss,ax      
     mov si,720h   

     mov di,0  
     mov bx,0

     mov ax,16
     mov cx,ax

   s:mov ss:[si][bx],ds:[di]  \将字符送入对应地址\   
     inc di
     inc bx

     mov ax,16
     mov ss:[si][bx],ds:[ax] \将颜色值送入对应地址\
     inc bx
     loop s

     mov ax,4c00h
     int 21h

code ends

end start

最佳答案

查看完整内容

嗯...,你犯了一个严重的错误啊!两个内存的值是不能相互传递的,必须通过AX来进行传递,以下的代码编译没问题,你看一下: assume cs:code,ds:data data segment db 'welcome to masm!' db '2h,24h,71h' ;颜色的值 data ends code segment start: mov ax,data mov ds,ax mov ax,0b800h ;第一个要输出字符的地址 mov es,ax mov si,720h ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-18 18:04:56 | 显示全部楼层

嗯...,你犯了一个严重的错误啊!两个内存的值是不能相互传递的,必须通过AX来进行传递,以下的代码编译没问题,你看一下:

assume  cs:code,ds:data
data segment

     db 'welcome to masm!'
     db '2h,24h,71h'   ;颜色的值

data ends

code segment

start:   

     mov ax,data
     mov ds,ax         

     mov ax,0b800h   ;第一个要输出字符的地址
     mov es,ax      
      mov si,720h     ;ss:si是显存的位置

     mov di,0  
     mov bx,0

     mov ax,16
     mov cx,ax     ;这样循环16次

   s:
   mov ax,ds:[di]
   mov es:[si+bx],ax   ;将字符送入对应地址   注意这里是不能讲一个内存的值传递想另一个内存的值的,必须先把它放在ax里面
     inc di
     inc bx

     mov bx,16
     mov ax,ds:[bx]
         mov es:[si+bx],ax;将颜色值送入对应地址   注意这里是不能讲一个内存的值传递想另一个内存的值的,必须先把它放在ax里面
     inc bx
     loop s

     mov ax,4c00h
     int 21h

code ends

end start


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

使用道具 举报

发表于 2014-4-18 18:42:05 | 显示全部楼层
嗯!这样吧!这个程序没问题,你看一下吧!

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               ;ds:bx指向data字符串

     mov ax,0b800h

     mov es,ax

     mov si,0               ;es:si指向显存

     mov cx,16

s:   mov al,[bx]            ;字符赋值al

     mov ah,02h             ;绿色

     mov es:[si].720h,ax    ;写入第12行64列

     mov ah,14h             ;绿底红色

     mov es:[si].7c0h,ax    ;写入第13行64列

     mov ah,71h             ;白底蓝色

     mov es:[si].860h,ax    ;写入第14行64列

     inc bx                 ;指向下一字符

     add si,2               ;指向下一显存单元

     loop s

     mov ax,4c00h

     int 21h

code ends

end start




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

使用道具 举报

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

使用道具 举报

发表于 2014-4-18 20:58:13 | 显示全部楼层
  s:mov ss:[si][bx],ds:[di]
你确定这样能行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-18 21:14:04 | 显示全部楼层
青玄 发表于 2014-4-18 18:04
嗯...,你犯了一个严重的错误啊!两个内存的值是不能相互传递的,必须通过AX来进行传递,以下的代码编译没 ...

谢谢,我只看到有寄存器要通过通用寄存器传递,都没看到内存也要,不知道是我看过忘记了,还是没仔细看视频
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-21 14:59:42 | 显示全部楼层
mov es:[si].720h,ax    ;写入第12行64列
为什么它代表12行64列,可以解释一下嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-22 16:08:29 | 显示全部楼层
艾蒙·瓦特 发表于 2014-4-21 14:59
mov es:[si].720h,ax    ;写入第12行64列
为什么它代表12行64列,可以解释一下嘛

我用的是王爽的汇编语言这本书,第九章 实验9 资料上面有显示器有25行每行有80个字符,每个字符有256种属性。也就是说一个字符要两字节储存一个字节存字符,一个字节存字符的属性。80个字符一行就是160字节,12行第64列也是就  (12*80+64)*2,结果是720H是16进制,10进制是1824,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-23 22:00:48 | 显示全部楼层
水月同洲 发表于 2014-4-22 16:08
我用的是王爽的汇编语言这本书,第九章 实验9 资料上面有显示器有25行每行有80个字符,每个字符有256种属 ...

请问我赋值的王爽答案的代码,编译成功后,我用cmd运行,就闪了一下屏幕,没有出现文字是什么原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-23 22:16:49 | 显示全部楼层
我也遇到了楼上说的问题,一闪而过,没显示:mad:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-24 03:02:10 | 显示全部楼层
我也出了这个问题,我还发了求助贴,但是手贱按错了不小心给力最佳答案,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-25 22:29:50 | 显示全部楼层
水月同洲 发表于 2014-4-22 16:08
我用的是王爽的汇编语言这本书,第九章 实验9 资料上面有显示器有25行每行有80个字符,每个字符有256种属 ...

12*80+64=1024     再乘以2  十进制应该是2048  十六进制是800H
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-26 02:35:40 | 显示全部楼层
艾蒙·瓦特 发表于 2014-4-25 22:29
12*80+64=1024     再乘以2  十进制应该是2048  十六进制是800H

:dizzy:没注意不好意思书上的...开始地址应该是11行第32个字符是起始地址。我那个是自己另外写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-26 11:22:17 | 显示全部楼层
跪求解释:本实验中我将按源代码敲进去或将源代码复制过去编译运行后,cmd一闪而过,根本没有显示文字什么的!(系统为win7旗舰版)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 08:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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