电器维修 发表于 2014-2-17 23:26:35

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

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

先上图片


由于是个人习惯问题,我平时练习的时候就喜欢用codesg不喜欢用CS
就然两个都是正确的(下边的汇编答案),为什么上图会显示这个乱码?

最后想的我实在是没有头绪了,看了甲鱼老师的视频答案,才发现是我写的是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:,200h
    mov word ptr es:,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,
   mov es:,al
   mov byte ptr es:,2h
   inc si
   add di,2
   loop s
   
   mov ax,4c00h
   int 21h

do0end:nop
codesg ends
end start
希望老师为我指点一下,小弟在此感激不尽。
如果可以我愿赠送您一次免费维修电器一次:lol::lol:!

pzhccy 发表于 2014-2-18 09:25:19

因为你的代码段是code,而不是codesg,你把assume cs:code改为assume cs:codesg试试,当然下面的代码段也要相应改变,codesg segment         codesg ends

电器维修 发表于 2014-2-18 20:17:21

pzhccy 发表于 2014-2-18 09:25 static/image/common/back.gif
因为你的代码段是code,而不是codesg,你把assume cs:code改为assume cs:codesg试试,当然下面的代码段也要 ...

不行啊。不管是改成code cod 随便写都不行,必须是CS才行!这个程序没法用DEBUG跟踪。我不知道它显示的是哪的内容。

dugwei 发表于 2014-2-18 20:21:34

这个问题提得好,也欢迎你去看看我提的问题:http://bbs.fishc.com/forum.php?mod=viewthread&tid=43855&page=1&extra=#pid1671424

oggplay 发表于 2014-2-18 22:04:48

本帖最后由 oggplay 于 2014-2-18 22:09 编辑

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


assume cs:codesg
codesg segment

如果你照我上面写就ok了

电器维修 发表于 2014-2-19 00:08:51

oggplay 发表于 2014-2-18 22:04 static/image/common/back.gif
虽然没看到你的 start:mov ax,codesg上一句是什么,但我肯定你写的不是




跟你的一样啊。下边有源代码啊!

pzhccy 发表于 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:,200h
                mov word ptr es:,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,
                mov es:,al
                inc si
                add di,2
                loop s
               
                mov ax,4c00h
                int 21h

d3:                nop
               
codesg ends

end start

电器维修 发表于 2014-2-19 21:50:17

本帖最后由 电器维修 于 2014-2-19 22:22 编辑

pzhccy 发表于 2014-2-19 11:03 http://bbs.fishc.com/static/image/common/back.gif


: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

oggplay 发表于 2014-2-19 22:44:41

电器维修 发表于 2014-2-19 21:50 static/image/common/back.gif
谢谢你老师我知道为什么我的现实的是乱码了。!
现在我已经非常明白为什么会显示乱码了。
...

真的明白了?下边的代码共同学习一下
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

zhaopengfei 发表于 2014-2-19 23:45:55

楼主用的是win7的系统的吧,你是怎么让程序在DOS里运行的?安装了虚拟机还是有其他什么办法,我的运行的话就是一闪而过。

电器维修 发表于 2014-2-20 20:21:31

oggplay 发表于 2014-2-19 22:44 static/image/common/back.gif
真的明白了?下边的代码共同学习一下
BOOTSEG = 0x7C0
INITSEG=0x9000


大哥你的代码我看不懂啊。我是菜鸟刚接触汇编。
为什么要加 # 号??
jmpi是什么指令?

oggplay 发表于 2014-2-20 20:50:00

本帖最后由 oggplay 于 2014-2-20 20:52 编辑

电器维修 发表于 2014-2-20 20:21 static/image/common/back.gif
大哥你的代码我看不懂啊。我是菜鸟刚接触汇编。
为什么要加 # 号??
jmpi是什么指令?
#不是代表常量么!
jmpi是段间调转

电器维修 发表于 2014-2-20 20:53:39

oggplay 发表于 2014-2-20 20:50 static/image/common/back.gif
#不是代表长量么!
jmpi是段间调转

不知道!我是干接触这方面先学的汇编。C什么的我都不知道。
方便留QQ吗!我是电器维修的。以后可以互相帮助!
页: [1]
查看完整版本: 关于王爽老师的汇编语言作业的一个疑问?编写内中断的试验