顺qi吇繎 发表于 2012-3-10 13:47:54

关于实验十六的诸多疑问?

本帖最后由 顺qi吇繎 于 2012-3-10 14:03 编辑

问题一:
代码1:
do7c:
subst:cmp ah,3
ja subend
cmp ah,0
je sub1
cmp ah,1
je sub2
cmp ah,2
je sub3
cmp ah,3
je sub4
subend:   iret

代码2:
do7c: jmp subst
table dw sub1,sub2,sub3,sub4
subst:push bx
cmp ah,3
ja subend
mov bl,ah
mov bh,0
add bx,bx
call word ptr table
subend:pop bx
iret

为什么我在测试中,代码1可以正确的跳到子程序,而代码2总是跳不到指定的子程序呢?
代码2是直接定址表法,需要在纯dos下才行吗?
问题二:
;在第四个子程序里
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               ;复制24次
sat:      push cx
      mov cx,160
      rep movsb               ;复制
      pop cx      
      loop sat
      
      mov cx,80
      mov si,0
s22:      
      mov byte ptr es:,' '
      add si,2
      loop s22
      
      pop ds
      pop es
      pop di
      pop si
      pop cx
      ret
请问下,下边的代码,
      cld
      mov cx,24               ;复制24次
sat:      push cx
      mov cx,160
      rep movsb               ;复制
      pop cx      
      loop sat
用得哪个寄存器调整的复制的n+1到n行的,si与di的值总是不变的
我怎么觉得代码的意思是 把第2行中的字符复制的第1行重复24次这个操作而没有n+1到n的效果呢?



莫名其妙 发表于 2012-3-10 17:05:10

本帖最后由 莫名其妙 于 2012-3-10 17:10 编辑

显示器一屏4000 25行 每行160列 所以第一行是0开始到159    第二行就160开始了 所si=160是n+1行di=0 是n行
下面不是有个CX=160   rep movsb这个就是把ds:si的数据复制160次然后给es:di CX=24是复制24行
                                                                                        movsb
页: [1]
查看完整版本: 关于实验十六的诸多疑问?