鱼C论坛

 找回密码
 立即注册
查看: 4191|回复: 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
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-2-18 09:25:19 | 显示全部楼层
因为你的代码段是code,而不是codesg,你把assume cs:code改为assume cs:codesg试试,当然下面的代码段也要相应改变,codesg segment           codesg ends
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不行啊。不管是改成code cod 随便写都不行,必须是CS才行!这个程序没法用DEBUG跟踪。我不知道它显示的是哪的内容。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

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


assume cs:codesg
codesg segment

如果你照我上面写就ok了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

跟你的一样啊。下边有源代码啊!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. codesg segment
  3. start:        mov ax,codesg
  4.                 mov ds,ax
  5.                 mov si,offset d0
  6.                
  7.                 mov ax,0
  8.                 mov es,ax
  9.                 mov di,200h
  10.                
  11.                 mov cx,offset d3 - offset d0
  12.                 cld
  13.                 rep movsb
  14.                
  15.                 mov word ptr es:[0*4],200h
  16.                 mov word ptr es:[0*4+2],0

  17.                 mov ax,4c00h
  18.                 int 21h
  19.                
  20. d0:                jmp d1
  21.                 db "divide error"
  22.                
  23. d1:                mov ax,0
  24.                 mov ds,ax
  25.                 mov si,202h
  26.                
  27.                 mov ax,0b800h
  28.                 mov es,ax
  29.                 mov di,12*160+36*2
  30.                
  31.                 mov cx,12
  32.         s:        mov al,[si]
  33.                 mov es:[di],al
  34.                 inc si
  35.                 add di,2
  36.                 loop s
  37.                
  38.                 mov ax,4c00h
  39.                 int 21h

  40. d3:                nop
  41.                
  42. codesg ends

  43. end start
复制代码
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

大哥你的代码我看不懂啊。我是菜鸟刚接触汇编。
为什么要加 # 号??
jmpi是什么指令?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

#不是代表常量么!
jmpi是段间调转
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不知道!我是干接触这方面先学的汇编。C什么的我都不知道。
方便留QQ吗!我是电器维修的。以后可以互相帮助!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-16 04:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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