鱼C论坛

 找回密码
 立即注册
查看: 2473|回复: 1

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

[复制链接]
发表于 2012-3-10 13:47:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 顺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[bx]
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:[160*24+si],' '
        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的效果呢?



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 13:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表