首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

,看看小弟我这段程序出了什么有关问题了

2012-04-24 
求助大虾,看看我这段程序出了什么问题了这个程序用于是程序启动后显示系统时间,但是显示的不对,请大虾帮忙

求助大虾,看看我这段程序出了什么问题了
这个程序用于是程序启动后显示系统时间,但是显示的不对,请大虾帮忙看看
这是这段代码运行效果,显示的年月日都变成秒了
http://www.cppblog.com/merlinfang/archive/2007/06/25/26946.html


assume   cs:code
code   Segment
start:
cli   ;避免在设置堆栈时中断
mov   ax,0                           ;mov   ax,cs
mov   ss,ax
mov   sp,7c00h
sti
mov   ax,0
mov   es,ax       ;要读的内存基址
mov   bx,800h   ;要读的内存偏移

mov   ah,2       ;功能号,读
mov   al,3       ;读三个扇区
mov   ch,0       ;磁道号
mov   cl,2       ;扇区号
mov   dl,0       ;驱动器号
mov   dh,0       ;磁头号(面)
int   13h        

;置CS,IP
mov   ax,0
mov   bx,800h
push   ax
push   bx
retf
;凑足一个扇区,主要满足int   19   对 '55AA '标志的要求
db   469   dup( 'A ')
db   85,170   ;55AA

T:jmp   RealPrograme
data   db   9,8,7,4,2,0
db   '//   ::   '
RealPrograme:            
            mov   ax,cs
            mov   ds,ax
            mov   si,offset   data
            mov   di,0
            mov   cx,6
s:        
            push   cx
            mov   al,ds:[si]
            out   70h,al
            in   al,71h
            mov   ah,al
            mov   cl,4
            shr   ah,cl
            and   al,00001111b
            add   ah,30h
            add   al,30h
            mov   dl,71h
            mov   bx,0b800h
            mov   es,bx
            mov   byte   ptr   es:[di].[160*12+40*2],ah
            mov   byte   ptr   es:[di].[160*12+40*2+1],dl
            add   di,2
            mov   byte   ptr   es:[di].[160*12+40*2],al
            mov   byte   ptr   es:[di].[160*12+40*2+1],dl
            ;inc   si
            add   di,2
            mov   al,ds:[si].[6]
            mov   byte   ptr   es:[di].[160*12+40*2],al
            mov   byte   ptr   es:[di].[160*12+40*2+1],dl
            add   di,2  
            inc   si
            pop   cx        


            loop   s
jmp   RealPrograme
code   ends
end   start




[解决办法]
大致看了下 RealPrograme 循环, 这个代码本身没看出来有什么问题. 如果确有问题的话, 比较可能是其载入的实际偏址和编译时的不一致, 导致对 data 的访问出错. 如果是在启动引导时使用的, 需要在 data 标号前加上 org 语句以指定实际载入的地址, 或者就需要自己对 data 的地址进行校正了
[解决办法]
应该不会啊. 加哪里了?
[解决办法]
你改改0800h,把第二个扇区加在到更高的内存区试试,例如8c00H,低内存区可能被BIOS使用着。也可以用winhex查看第二扇区的内容,看看内容是否正确,或者在dos下用debug加在第二扇区,用u反汇编一下,看看是否是你的源代码。

热点排行