关于王爽老师的汇编语言作业的一个疑问?编写内中断的试验
本帖最后由 电器维修 于 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:!
因为你的代码段是code,而不是codesg,你把assume cs:code改为assume cs:codesg试试,当然下面的代码段也要相应改变,codesg segment codesg ends pzhccy 发表于 2014-2-18 09:25 static/image/common/back.gif
因为你的代码段是code,而不是codesg,你把assume cs:code改为assume cs:codesg试试,当然下面的代码段也要 ...
不行啊。不管是改成code cod 随便写都不行,必须是CS才行!这个程序没法用DEBUG跟踪。我不知道它显示的是哪的内容。
这个问题提得好,也欢迎你去看看我提的问题:http://bbs.fishc.com/forum.php?mod=viewthread&tid=43855&page=1&extra=#pid1671424 本帖最后由 oggplay 于 2014-2-18 22:09 编辑
虽然没看到你的 start:mov ax,codesg上一句是什么,但我肯定你写的不是
assume cs:codesg
codesg segment
如果你照我上面写就ok了
oggplay 发表于 2014-2-18 22:04 static/image/common/back.gif
虽然没看到你的 start:mov ax,codesg上一句是什么,但我肯定你写的不是
跟你的一样啊。下边有源代码啊! 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 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
电器维修 发表于 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 楼主用的是win7的系统的吧,你是怎么让程序在DOS里运行的?安装了虚拟机还是有其他什么办法,我的运行的话就是一闪而过。 oggplay 发表于 2014-2-19 22:44 static/image/common/back.gif
真的明白了?下边的代码共同学习一下
BOOTSEG = 0x7C0
INITSEG=0x9000
大哥你的代码我看不懂啊。我是菜鸟刚接触汇编。
为什么要加 # 号??
jmpi是什么指令? 本帖最后由 oggplay 于 2014-2-20 20:52 编辑
电器维修 发表于 2014-2-20 20:21 static/image/common/back.gif
大哥你的代码我看不懂啊。我是菜鸟刚接触汇编。
为什么要加 # 号??
jmpi是什么指令?
#不是代表常量么!
jmpi是段间调转 oggplay 发表于 2014-2-20 20:50 static/image/common/back.gif
#不是代表长量么!
jmpi是段间调转
不知道!我是干接触这方面先学的汇编。C什么的我都不知道。
方便留QQ吗!我是电器维修的。以后可以互相帮助!
页:
[1]