标题:麻烦请教一下这段代码里的各个寄存器是干什么用的啊
只看楼主
oped02
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2022-10-16
结帖率:100%
已结贴  问题点数:20 回复次数:5 
麻烦请教一下这段代码里的各个寄存器是干什么用的啊

;参数列表:bx:操作系统中的文件描述符fd,可以用来进行对文件的操作、cx:读取的字节数、dx:数据缓冲区地址
read_block    proc    near
    push    bx
    push    cx
    push    dx
    cmp    cur,200            ;缓冲区里有200个字符吗?
    jnz    back            ;结果不为0则转移
    ;if no more chars in buf can be displayed then read another 200 chars ;
    mov    cx,200   
    mov    bx , handle        ;将fd传给bx好操作
    mov    dx , offset buf
    mov    ah , 3fh        ;读文件或设备
    int    21h            
    mov    cur,0
    mov    ax,1            ;
    jnc    back
    mov    cur,200
    mov    ax ,0
back:
    pop    dx
    pop    cx
    pop    bx
    ret
read_block    endp
;****************************************************************
搜索更多相关主题的帖子: 代码 mov back push 寄存器 
2022-11-20 00:00
oped02
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2022-10-16
得分:0 

这个貌似就是以上代码的流程图,
但我不理解的几点有
1、为什么要mov    ax,1后 jnc    back
2. cur是干什么的啊
2022-11-20 00:02
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:20 
这是你上条问题的其中一个子程序,我已说过,这坨代码写得十分累赘,如果你的贴文没有抄错,基本逻辑也有问题,
不然也不会一直循环显示,不止不休.不管是网上抄的,或者你的同学甚至是老师的作品,这都是汇编没学好的表现.

这段代码是这样设定,执行完int21h后,只要进位标志cf=0就就表示成功读到,设定ax=1和cur=0返回.
若进位标志cf=1就就表示读取失败,设定ax=0和cur=200返回.

但作者没有考虑,即使读完了,读不到任何东西,cf也是0,这只表示没有读取失败而已,决定实际读取长度由ax传回.
这里没有判别,所以程式才会没完没了.你可以参考我在在上一条问题的4楼,那里的代码是精简和修正了.

回答问题
1.
这段代码里的各个寄存器是干什么用的啊.....

int21h,ah=3fh,参数如下
bx=handle,就是句柄,由开启档案(ah=3dh)时传回.
cx=要求读取长度
ds:dx=读入资料放置的地址
若读取成功,cf=0,ax=实际读取长度,就读完了,ax=0,cf也=0
档案handle有一个内部指针,开启档案成功后,指针会指向档案起首,即=0
每次读取成功,指针会移到'实际读取长度'之后,下次再执行3fh,指针由新位置读起.
所以若档案长1000,每次读200,会分5次才读完,第6次读不到东西了,ax=0,cf也是=0

若读取失败,cf=1,表示档案有错,并不表示读完,读完以cf=0,ax=0作准.
(1楼的代码是错误的使用cf表示读完)


2.
1、为什么要mov    ax,1后 jnc    back

代码是这样
   mov    ah , 3fh        ;读文件或设备
    int    21h  
    ;这里执行完21h,cf已经传回读取是否有错,0或1
    mov    cur,0
    mov    ax,1         
    jnc    back        ;前面的2条指令并不影响cf值,到这里才作jnc分支,和上条mov ax,1没有关系



2022-11-20 06:03
oped02
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2022-10-16
得分:0 
回复 3楼 Valenciax
感谢版主大大
另外,这份代码就是我们所学的《IBM-PC汇编语言程序设计 实验教程》里的源码
很多年前的老事物了
我在网上也看过有关的评论,大部分都是说这本书不适合入门
麻烦再咨询一下大大,有什么适合初学者进阶的汇编资料吗,我感觉学了一两个月的汇编还是不能很好地编写出自己的代码,每次一看到题目就头脑空白
写出一份代码我都是先写出相应的C语言再转化成汇编代码
2022-11-20 10:14
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
楼主贴的是dos的16bit代码,很古老了,除非学校必修,建议不必深究,看明白流程和代码即可,汇编只少要由win32开始.
2022-11-21 15:18
oped02
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2022-10-16
得分:0 
回复 5楼 Valenciax
好的,感谢大大建议
2022-11-22 12:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510706-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.694846 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved