. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验十六够郁闷啊,为什么直接运行就出错,单步跟踪就没问题?  [待解决] 回复[ 4次 ]   点击[ 740次 ]  
hualongmian
[帖 主]   [ 发表时间:2008-06-06 12:56 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2008-05-13 20:29
有两点不符的情况:
1、在7ch向量表中,单步执行指向正确的地址,直接运行则指向错误的地址,区别在于段地址的不同,而偏移地址没问题。
2、直接运行,rep movsb指令并没有把程序复制到指定的地方,而单步执行则没问题。
为什么?是不是程序哪个地方出错了,望指点下。

assume cs:code
code segment
start:        mov ax,code
        mov ds,ax
        mov si,offset sqr_st
        mov ax,seg a
        mov es,ax
        mov di,offset a
        mov cx,offset sqr_end-offset sqr_st
        cld
        rep movsb
        cli
        mov ax,0
        mov es,ax
        mov ax,offset a
        mov word ptr es:[4*7ch],ax
        mov word ptr es:[4*7ch+2],cs
        sti
        mov ah,4ch
        int 21h

sqr_st:        jmp sqr_co
table dw offset sub0-offset sqr_st,offset sub1-offset sqr_st,offset sub2-

offset sqr_st,offset sub3-offset sqr_st        ;相对于此程序起始地址的偏移位移。
sqr_co:        push bx
        cmp ah,3
        ja sqr_ir
        mov bl,ah
        add bl,bl
        mov bh,0
        mov bx,table[bx]
        mov si,offset a        ;程序的起始地址。
        call word ptr cs:[bx+si];CS为此程序的段地址。

sqr_ir:        pop bx
        iret

sub0:        push es
        push di
        push cx
        mov di,0b800h
        mov es,di
        mov di,0
        mov cx,2000
sub0s0:        mov byte ptr es:[di],' '
        add di,2
        loop sub0s0
        pop cx
        pop di
        pop es
        ret

sub1:        push di
        push es
        push cx
        mov di,1
        mov cl,es:[di]
        and cl,11111000b
        or al,cl        ;add al,ah
        mov cx,2000
sub1s0: mov byte ptr es:[di],al
        add di,2
        loop sub1s0
        pop cx
        pop es
        pop di
        ret

sub2:        push cx
        push es
        push di
        mov di,1
        mov cl,4
        shr al,cl
        mov cl,es:[di]
        and cl,10001111b
        or al,cl        ;add al,cl
        mov cx,2000
sub2s0: mov byte ptr es:[di],al
        add di,2
        loop sub1s0
        pop di
        pop es
        pop cx
        ret

sub3:        push ds
        push es
        push si
        push di
        push cx
        mov di,0b800h
        mov ds,di
        mov es,di
        mov si,160
        mov di,0
        mov cx,160*24        ;后面24行的长度。
        cld
        rep movsb
        mov cx,80
        mov si,160*24
sub3s0:        mov byte ptr ds:[si],' '
        add si,2
        loop sub3s0
        pop cx
        pop di
        pop si
        pop es
        pop ds
        ret
sqr_end:nop
a:        db offset sqr_end-offset sqr_st dup (0)        

code ends
end start
martian
[第1楼]   [ 回复时间:2008-06-17 19:00 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:0
注册日期:2007-07-26 10:58
静下心来好好调试,已经学到这里,楼主是有能力把这个程序跳出来的。
younggay
[第2楼]   [ 回复时间:2008-06-18 15:19 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
看看是不是什么地方的寄存器依赖了默认值了,debug下面和直接运行的时候,有些寄存器可不能随便默认啊。该是什么值就得赋什么值。
仔细在排查一下代码吧。
vizwind
[第3楼]   [ 回复时间:2008-10-20 14:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-09-15 15:58
估计问题是出在使用cs段安装中断例程,换成0:200试试就知道了
suiyueran
[第4楼]   [ 回复时间:2009-02-03 18:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-31 16:41
调试了两天 终于成功 
assume cs:code 
code segment 
start:mov ax,cs 
    mov ds,ax 
    mov si,offset screen   
    mov ax,0 
    mov es,ax 
    mov di,200h 
    mov cx,offset screenend-offset screen 
    cld 
    rep movsb 
    mov word ptr es:[7ch*4],200h 
    mov word ptr es:[7ch*4+2],0 
  
     
     
          mov ax,4c00h 
          int 21h 

;=========screen=====     
screen:jmp short set 
   table dw  offset sub1-offset screen+200h ,offset sub2-offset screen+200h, offset sub3-offset screen+200h , offset sub4-offset screen+200h                     
 set:push bx  
     
    cmp ah,3 
    ja sret     
    mov bl,ah 
    mov bh,0 
    add bx,bx 
     
    call word ptr cs:[bx].202h 
    sret:pop bx 
    iret             
     
;-----------sub1===== 
sub1:push bx 
    push cx 
    push es 
    mov bx,0b800h 
    mov es,bx 
    mov bx,0 
    mov cx,2000 
sub1s:mov byte ptr es:[bx],' ' 
    add bx,2 
    loop sub1s 
    pop es 
    pop cx 
    pop bx 
    ret 
;=======sub2====== 
sub2:push bx 
    push cx 
    push es 
    mov bx,0b800h 
    mov es,bx 
    mov bx,1 
    mov cx,2000 
sub2s:and byte ptr es:[bx],11111000b 
    or es:[bx],al 
    add bx,2 
    loop sub2s 
    pop es 
    pop cx 
    pop bx 
    ret 
;------------    sub3    ----- 
sub3:push bx 
    push cx 
    push es 
    mov cl,4 
    shl al,cl 
    mov bx,0b800h 
    mov es,bx 
    mov bx,1 
    mov cx,2000 
sub3s:and byte ptr es:[bx],10001111b 
    or es:[bx],al 
    add bx,2 
    loop sub3s 
    pop es 
    pop cx 
    pop bx 
    ret 
;============sub4     ===== 
sub4:push cx 
    push si 
    push di 
    push es 
    push ds 
    mov si,0b800h 
    mov es,si 
    mov ds,si 
    mov si,160 
    mov di,0 
    cld 
    mov cx,24 
sub4s:push cx 
    mov cx,160 
    rep movsb 
    pop cx 
    loop sub4s 
    mov cx,80 
    mov si,0 
sub4s1:mov byte ptr [160*24+si],' ' 
    add si,2 
    loop sub4s1 
    pop ds 
    pop es 
    pop di 
    pop si 
    pop cx 
    ret 
screenend:nop         
code ends 
    end start                         
大家多多指教
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved