鱼C论坛

 找回密码
 立即注册
查看: 1990|回复: 10

求好心人运行程序,实验九!

[复制链接]
发表于 2013-2-17 05:10:29 | 显示全部楼层 |阅读模式
10鱼币
各位高手好,我的系统是win7 64位的,不能用debug 看运行结果。
学到了汇编的实验九,试着编了一下程序,不能看结果让我很不爽。所以我把代码贴上来,请好心人运行一下,看能不能出结果。
小弟不才,不知有没有错误,如有请您指出!
出了结果请截图,多谢!
assume cs:code,ds:data

data segment
        dd 60h,02h,77h,02h,65h,02h,6ch,02h,63h,02h,6fh,02h,6dh,02h,65h,02h,0,02h,74h,02h,6fh,02h,0,02h,6dh,02h,61h,02h,73h,02h,6dh,02h,21h,02h,60h,02h ; 定义为黑底绿字
        dd 60h,24h,77h,24h,65h,24h,6ch,24h,63h,24h,6fh,24h,6dh,24h,65h,24h,0,24h,74h,24h,6fh,24h,0,24h,6dh,24h,61h,24h,73h,24h,6dh,24h,21h,24h,60h,24h ; 定义为绿底红字
        dd 60h,71h,77h,71h,65h,71h,6ch,71h,63h,71h,6fh,71h,6dh,71h,65h,71h,0,71h,74h,71h,6fh,71h,0,71h,6dh,71h,61h,71h,73h,71h,6dh,71h,21h,71h,60h,71h ; 定义为白底蓝色
data ends

code segment

start:  mov ax,data
                mov ds,ax
                mov ax,b800h
                mov es,ax  ; 把段地址为es的当做显存段地址
                mov si,0
                mov bx,0
        
                mov cx,36 ; data中的数据一行为36个字节
        s:  mov ax,ds:[bx]
                mov es:[si],ax ; 把ds中的数据赋值给显存
                inc bx
                inc si ; 逐一赋值
                loop s ; dos应该显示黑底绿字
                
                add bx,1 ; ds中的数据是连续的
                add si,124 ; 显存es中的数据不连续,一共有80列,160个字节,赋值了36个,还有124个需要跳过,到显存的第二行第一个字节
                
                mov cx,36
        s1: mov ax,ds:[bx]
                mov es:[si],ax
                inc bx
                inc si
                loop s1 ; dos应该显示绿底红字
                
                add bx,1
                add si,124 ; 到显存的第三行第一个字节
                
                mov cx,36
        s2: mov ax,ds:[bx]
                mov es:[si],ax
                inc bx
                inc si
                loop s2 ; dos应该显示白底蓝色
                
                mov ax,4c00h
                int 21h
code ends
end start
                
再次跪谢!

最佳答案

查看完整内容

我给出修正后的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-17 05:10:30 | 显示全部楼层
我给出修正后的代码
assume cs:code,ds:data

data segment
        db 60h,02h,77h,02h,65h,02h,6ch,02h,63h,02h,6fh,02h,6dh,02h,65h,02h,0,02h,74h,02h,6fh,02h,0,02h,6dh,02h,61h,02h,73h,02h,6dh,02h,21h,02h,60h,02h ; 定义为黑底绿字
        db 60h,24h,77h,24h,65h,24h,6ch,24h,63h,24h,6fh,24h,6dh,24h,65h,24h,0,24h,74h,24h,6fh,24h,0,24h,6dh,24h,61h,24h,73h,24h,6dh,24h,21h,24h,60h,24h ; 定义为绿底红字
        db 60h,71h,77h,71h,65h,71h,6ch,71h,63h,71h,6fh,71h,6dh,71h,65h,71h,0,71h,74h,71h,6fh,71h,0,71h,6dh,71h,61h,71h,73h,71h,6dh,71h,21h,71h,60h,71h ; 定义为白底蓝色
data ends

code segment

start:  mov ax,data
                mov ds,ax
                mov ax,0b800h
                mov es,ax  ; 把段地址为es的当做显存段地址
                mov si,0
                mov bx,0
        
                mov cx,36 ; data中的数据一行为36个字节
        s:  mov al,ds:[bx]
                mov es:[si],al ; 把ds中的数据赋值给显存
                inc bx
                inc si ; 逐一赋值
                loop s ; dos应该显示黑底绿字
                
                add si,124 ; 显存es中的数据不连续,一共有80列,160个字节,赋值了36个,还有124个需要跳过,到显存的第二行第一个字节
                
                mov cx,36
        s1: mov al,ds:[bx]
                mov es:[si],al
                inc bx
                inc si
                loop s1 ; dos应该显示绿底红字
                
                add si,124 ; 到显存的第三行第一个字节
                
                mov cx,36
        s2: mov al,ds:[bx]
                mov es:[si],al
                inc bx
                inc si
                loop s2 ; dos应该显示白底蓝色
                
                mov ax,4c00h
                int 21h
code ends
end start
                
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-17 09:33:07 | 显示全部楼层
装个虚拟机吧。我的win7也没有debug。用VM或者VBox装个XP自己试验多好....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-19 11:19:09 | 显示全部楼层
IR{B1VD~L_DNU7Y`HGXV`0O.jpg
这是运行结果。还有13行的数字,应该是0b800h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-19 22:24:55 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-19 22:25:27 | 显示全部楼层
七月之变 发表于 2013-2-19 11:19
这是运行结果。还有13行的数字,应该是0b800h

额,我这都错的找不到边儿了。谢谢啦!大神,能看出来哪里有问题吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-20 12:10:52 | 显示全部楼层
你没分清楚ax与al的区别。
mov ax,ds:[bx]
mov es:[si],ax
这个是取一个字,也就是两个字节,应该改成
mov al, ds:[bx]
mov es:[si],al
下面的也是一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-20 16:44:07 | 显示全部楼层
还有两个问题。
第一个是定义数据应该是db,而不是dd
第二个是add si,124应该是add si , 125
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-20 16:52:02 | 显示全部楼层
还有一个错误。。。
你的inc bx是后执行的,所以你的loop后面的add bx, 1是不需要的,要了就错了……
(不好意思。前面都是目测,实际测试过才发现)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-20 16:53:15 | 显示全部楼层
那这样的话,add si, 124就是对的了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-20 21:24:59 | 显示全部楼层
七月之变 发表于 2013-2-20 16:53
那这样的话,add si, 124就是对的了。

多谢七月之变!我现在知道自己那里有问题了,谢谢你的耐心解释!
路漫漫其修远兮,我们上下而求索
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 00:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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