求助大虾,看看我这段程序出了什么问题了

merlinfang 2007-06-25 10:14:34
这个程序用于是程序启动后显示系统时间,但是显示的不对,请大虾帮忙看看
这是这段代码运行效果,显示的年月日都变成秒了
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


...全文
224 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
merlinfang 2007-07-03
  • 打赏
  • 举报
回复
已经找到原因了。
主要是使用静态地址分配,长度地址只能自己算了,谢谢大家
mov ax,0
mov ds,ax
lea bx,T
lea ax,data
sub ax,bx
add ax,800h
mov si,ax
mengshijie_1981 2007-07-02
  • 打赏
  • 举报
回复
你改改0800h,把第二个扇区加在到更高的内存区试试,例如8c00H,低内存区可能被BIOS使用着。也可以用winhex查看第二扇区的内容,看看内容是否正确,或者在dos下用debug加在第二扇区,用u反汇编一下,看看是否是你的源代码。
merlinfang 2007-07-02
  • 打赏
  • 举报
回复
加在T的前面
zara 2007-06-28
  • 打赏
  • 举报
回复
应该不会啊. 加哪里了?
merlinfang 2007-06-27
  • 打赏
  • 举报
回复
试了加上org 0800h还是没有起到作用
whua6238 2007-06-27
  • 打赏
  • 举报
回复
tongyi!
zara 2007-06-27
  • 打赏
  • 举报
回复
放到启动程序里不对, 那就是没通过 org 语句设置运行时的载入偏址造成的. 即, 如果你的这段代码是载入到 7c00h 处执行的话, 在 T: 标号之前应该加上 org 7c00h; 如果是载入到 0800h 处的话, 就应该是 org 0800h. 否则, data 的标号的偏址肯定会不对
mengshijie_1981 2007-06-27
  • 打赏
  • 举报
回复
检查你的启动程序!
zhgwbzhd 2007-06-26
  • 打赏
  • 举报
回复
我怎么没看明白你的代码的含意呢?
merlinfang 2007-06-26
  • 打赏
  • 举报
回复
我也是运行下面一段也是好好的,但是放在启动程序里面就不行了

今天又调了一晚上了,还是乱码啊。。。
mengshijie_1981 2007-06-26
  • 打赏
  • 举报
回复
下面是该程序在我的机器上的运行结果:












07/06/26 22:48:47
似乎没有问题啊,我只编译了下面的代码:
assume cs:code
code Segment
start:

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

zara 2007-06-26
  • 打赏
  • 举报
回复
大致看了下 RealPrograme 循环, 这个代码本身没看出来有什么问题. 如果确有问题的话, 比较可能是其载入的实际偏址和编译时的不一致, 导致对 data 的访问出错. 如果是在启动引导时使用的, 需要在 data 标号前加上 org 语句以指定实际载入的地址, 或者就需要自己对 data 的地址进行校正了

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧