鱼C论坛

 找回密码
 立即注册
查看: 3767|回复: 12

关于王爽老师的汇编语言作业的一个疑问?编写内中断的试验

[复制链接]
发表于 2014-2-17 23:26:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 电器维修 于 2014-2-17 23:28 编辑

先上图片
QQ截图20140217230727.png QQ截图20140217230815.png

由于是个人习惯问题,我平时练习的时候就喜欢用codesg不喜欢用CS
就然两个都是正确的(下边的汇编答案),为什么上图会显示这个乱码?
QQ截图20140217231456.png
最后想的我实在是没有头绪了,看了甲鱼老师的视频答案,才发现是我写的是codesg 甲鱼老师的是CS
只要把两个换一下就显示正常了
传个源代码
assume cs:codesg
codesg segment
start:
 mov ax,codesg
    mov ds,ax
    mov si,offset do0
    mov ax,0
    mov es,ax
    mov di,200h
    mov cx,offset do0end-offset do0
    cld
    rep movsb
   
    mov word ptr es:[0*4],200h
    mov word ptr es:[0*4+2],0h
   
    mov ax,4c00h
    int 21h
   
do0:   
 jmp short do0start
    db 'chen tao shi da ben dan !'
   
do0start:
 mov ax,codesg
    mov ds,ax
   mov si,202h
   
   mov ax,0b800h
   mov es,ax
   mov di,12*160+36*2
   
   mov cx,25
s:
   mov al,[si]
   mov es:[di],al
   mov byte ptr es:[di+1],2h
   inc si
   add di,2
   loop s
   
   mov ax,4c00h
   int 21h
  
do0end:nop
codesg ends
end start
希望老师为我指点一下,小弟在此感激不尽。
如果可以我愿赠送您一次免费维修电器一次:lol::lol:!
QQ截图20140217230815.png
QQ截图20140217230727.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-18 09:25:19 | 显示全部楼层
因为你的代码段是code,而不是codesg,你把assume cs:code改为assume cs:codesg试试,当然下面的代码段也要相应改变,codesg segment           codesg ends
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-18 20:17:21 | 显示全部楼层

不行啊。不管是改成code cod 随便写都不行,必须是CS才行!这个程序没法用DEBUG跟踪。我不知道它显示的是哪的内容。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-18 20:21:34 | 显示全部楼层
这个问题提得好,也欢迎你去看看我提的问题:http://bbs.fishc.com/forum.php?m ... p;extra=#pid1671424
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-18 22:04:48 | 显示全部楼层
本帖最后由 oggplay 于 2014-2-18 22:09 编辑

虽然没看到你的 start:mov ax,codesg上一句是什么,但我肯定你写的不是


assume cs:codesg
codesg segment

如果你照我上面写就ok了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-19 00:08:51 | 显示全部楼层
oggplay 发表于 2014-2-18 22:04
虽然没看到你的 start:mov ax,codesg上一句是什么,但我肯定你写的不是

跟你的一样啊。下边有源代码啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-19 11:03:36 | 显示全部楼层
assume cs:codesg

codesg segment
start:        mov ax,codesg
                mov ds,ax
                mov si,offset d0
                
                mov ax,0
                mov es,ax
                mov di,200h
                
                mov cx,offset d3 - offset d0
                cld
                rep movsb
                
                mov word ptr es:[0*4],200h
                mov word ptr es:[0*4+2],0

                mov ax,4c00h
                int 21h
                
d0:                jmp d1
                db "divide error"
                
d1:                mov ax,0
                mov ds,ax
                mov si,202h
                
                mov ax,0b800h
                mov es,ax
                mov di,12*160+36*2
                
                mov cx,12
        s:        mov al,[si]
                mov es:[di],al
                inc si
                add di,2
                loop s
                
                mov ax,4c00h
                int 21h

d3:                nop
                
codesg ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-19 21:50:17 | 显示全部楼层
本帖最后由 电器维修 于 2014-2-19 22:22 编辑


:handshake 谢谢你老师我知道为什么我的现实的是乱码了。!
现在我已经非常明白为什么会显示乱码了。
1.你的源代码我试过了能正常显示字符,只是有一点你的中断显示字符的代码是直接给出的DS地址。0:202h(这样在除法溢出的时候代码就会自动从0:202h处读取字符送到显示内存)

2.我的代码是没有给出显示字符代码的地址(codesg:202h),当把这部分代码复制到0:200h处以后,(我用debug跟踪了,是把所有的字符都复制过去了)jmp指令跳到了do0start标号处开始执行代码了,但是之前的安装代码已被内存释放了,或有新的内容覆盖了。{我感觉显示的字符可能是覆盖的内容!}

3.再有一种就是使用CS(我跟踪过了这个是最好的)它是把整个代码段的原数据照搬的复制。不管是你把这段代码放在0:200处还是0001:200或0100:200,随意地方,在触发溢出中断的时候他都能找到所在自己代码段中要显示的字符。 ( 我感觉帮忙的老师的代码不如这个严斯紧密,得自己给出代码段的段地址)

谢谢楼上的老师让我彻底弄明白这个问题了!:handshake:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-19 22:44:41 | 显示全部楼层
电器维修 发表于 2014-2-19 21:50
谢谢你老师我知道为什么我的现实的是乱码了。!
现在我已经非常明白为什么会显示乱码了。
...

真的明白了?下边的代码共同学习一下
BOOTSEG = 0x7C0
INITSEG=0x9000
entry start
start:
mov ax,#BOOTSEG
mov ds,ax
mov ax,#INITSEG
mov es,ax
mov cx,#256         
sub si,si                 
sub di,di                  
cld
rep
movw
jmpi go,INITSEG
go: mov ax,cs
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-19 23:45:55 | 显示全部楼层
楼主用的是win7的系统的吧,你是怎么让程序在DOS里运行的?  安装了虚拟机还是有其他什么办法,我的运行的话就是一闪而过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-20 20:21:31 | 显示全部楼层
oggplay 发表于 2014-2-19 22:44
真的明白了?下边的代码共同学习一下
BOOTSEG = 0x7C0
INITSEG=0x9000

大哥你的代码我看不懂啊。我是菜鸟刚接触汇编。
为什么要加 # 号??
jmpi是什么指令?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-20 20:50:00 | 显示全部楼层
本帖最后由 oggplay 于 2014-2-20 20:52 编辑
电器维修 发表于 2014-2-20 20:21
大哥你的代码我看不懂啊。我是菜鸟刚接触汇编。
为什么要加 # 号??
jmpi是什么指令?

#不是代表常量么!
jmpi是段间调转
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-20 20:53:39 | 显示全部楼层
oggplay 发表于 2014-2-20 20:50
#不是代表长量么!
jmpi是段间调转

不知道!我是干接触这方面先学的汇编。C什么的我都不知道。
方便留QQ吗!我是电器维修的。以后可以互相帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-29 23:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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