. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->使用BIOS进行键盘输入和磁盘读写
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课设2 极“瘦身”后为何能“躲过”被覆盖  [已解决] 回复[ 2次 ]   点击[ 420次 ]  
hky987654321
[帖 主]   [ 发表时间:2014-03-09 13:53 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
assume cs:code
code segment
        mov  bx,offset MyData        ;共351b写入软盘
        mov  ax,cs
        mov  es,ax
        mov  ax,0301h
        mov  cx,0001h
        mov  dx,0000h
        int  13h
        mov  ax,4c00h
        int  21h
MyData:jmp  short MyCode                               ;首址 7C00h
db '1) Reset pc 2) Start system 3) Clock 4) Set clock$';首址 7C02h
db 9,9,5,8,8,5,7,7,5,4,4,5,2,2,5,0,0,5,  0,0,0FFh,0FFh ;首址 7C34h
db '2000/00/00 00:00:00$',10h               ;首址/尾址 7C4Ah/7C5Eh
MyCode: mov  bx,0B800h
        mov  es,bx
        call CLS
        mov  si,7C02h
        mov  bx,0007h                ;页号/颜色
        mov  dx,0C0Fh
        call ShowString              ;显示主界面
        mov  ah,0
        int  16h                     ;读、转
        call CLS
        cmp  al,33h
        jnb  IsClock
        cmp  al,32h
        je   StartSystem
ResetPc:jmp  dword ptr cs:[7C46h]    ;1) Reset pc
StartSystem: sub ax,ax               ;2) Start system
        mov  es,ax
        mov  bx,7C00h                ;没覆盖 ?
        mov  ax,0201h
        mov  cx,0001h
        mov  dx,0080h
        int  13h
        jmp  bx
IsClock:ja   SetClock
Clock:  call Time                    ;3) Clock
        in   al,60h
        cmp  al,1h
        je   ResetPc                 ;Esc返回
        cmp  al,3Bh                  ;F1键
        jne  Clock
        inc  bl                      ;变色
        and  bl,7
        jmp  Clock
SetClock:call Time                   ;4) Set clock
 H_key: mov  si,dx
        and  si,00FFh
        mov  bp,si
        add  si,si
        add  si,12*160
        mov  byte ptr es:[si].1,5Fh  ;着色
        mov  al,cs:[bp].7C13h        ;[bp].7C13h=[(bp-33)+7C34h]
        out  70h,al
        in   al,71h
        mov  ch,al
        mov  ah,0
        int  16h
        cmp  ah,4Dh                  ;“→”右移
        je   ShiftRight
        cmp  ah,1
        je   ResetPc                 ;Esc返回
        and  al,0Fh
        cmp  byte ptr cs:7C13h[bp].1,5
        jne  Tdigit
        and  ch,0F0h                 ;抹去个位数
Wri_in: or   al,ch
        out  71h,al
        jmp  SetClock
Tdigit: mov  cl,4
        shl  al,cl
        and  ch,0Fh                  ;抹去十位数
        jmp  Wri_in
ShiftRight:  inc dl
        mov  byte ptr es:[si].1,7    ;脱色
        jmp  H_key
CLS:    sub  bp,bp                   ;① CLS (任务:清屏)
        mov  cx,25*80
 CLS_s: mov  byte ptr es:[bp],' '
        add  bp,2
        loop CLS_s
        ret
ShowString: mov  al,cs:[si]          ;② ShowString (任务:显示字符串)
        inc  si
        cmp  al,'$'
        je   ShOver
        mov  ah,2
        int  10h
        mov  ah,9
        mov  cx,1
        int  10h
        inc  dl
        jmp  ShowString
ShOver: mov  dl,1Fh
        ret
  Time: sub  bp,bp                   ;③ Time (任务:显示时间)
Time_s: mov  al,cs:[bp].7C34h
        out  70h,al
        in   al,71h
        mov  word ptr cs:[bp].7C4Ch,3030h
        sub  ah,ah
        div  byte ptr cs:[7C5Eh]
        add  cs:[bp].7C4Ch,ax
        add  bp,3
        cmp  bp,18
        jb   Time_s
        mov  dx,0C1Fh
        mov  si,7C4Ah
        call ShowString
        ret
code ends
end
hky987654321
[第1楼]   [ 回复时间:2014-03-17 00:46 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
1、这个课设2装于7C00h处,其子程序2) Start system 的jmp  bx语句可删除而不影响程序,
而其它装于7E00h处的版本,其jmp  bx被删除就不能实现子程序2) Start system ,为什么?
2、这个课设2的数据区尾址不能大于7C60h,否则子程序2) Start system也不能正常运行,为什么?
hky987654321
[第2楼]   [ 回复时间:2014-04-08 09:10 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
此贴由 贴主 于 [ 2014-04-08 09:10 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved