大家好,小弟初学汇编有两个小问题,希望赐教

psprite 2003-10-16 06:16:54
1,小皮发现硬盘主引导扇区有这样一段代码:
XOR AX,AX
`````
PUSH AX
POP ES
此处用了XOR AX,AX 为什么不用 MOV AX,0000
还有就是PUSH AX
POP ES
为什么不直接用 MOV ES,0000?这样还省代码,而且功能也相同,是不是处理器在处理两句代码时在时间上有差别呢?
2。
小皮只知道在读CMOS 时可以用
MOV CX,0000
MOV BX,0200
MOV AL,CH
OUT 70,AL
IN AL,71
MOV [BX],AL
INC BX
INC CH
DEC CL
JNZ 0106 (跳转到MOV AL,CH)
INT 20

不过在怎么给CMOS请零呢?以为IN 只使内存得到了一个CMOS内的数据,
怎么对CMOS内的数据进行修改呢?
前辈们看看我下面写的清CMOS的程序对吗?
MOV CX,0000
MOV AL,CH
OUT 70,AL
IN AL,71
MOV AL,00 (此处可以这么直接修改吗?)
INC CH
DEC CL
JNZ 0103(跳转到MOV AL,CH)
INT 20

小弟初学,谢谢各位了~``
...全文
64 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
david158679 2003-10-18
  • 打赏
  • 举报
回复
看完以上的东西,我受益非浅。
psprite 2003-10-18
  • 打赏
  • 举报
回复
感谢qingjin,小皮学到了很多,努力ing!
qingjin 2003-10-18
  • 打赏
  • 举报
回复
不是要用xor al,al提供时延,而是此处必须延时。
书上在对端口的两次操作间使用了jmp $+2(知道什么意思吗?)来延时,此时两次操作间没有其它语句。
我的书上的另一个例子中,操作间有一条语句,我认为可以延时了,但书上仍再使用了jmp $+2。
似乎您对上面的算法不太明白,是这样吗?
我说的要注意int 20h问题就是说EXE类型的程序不能用"int 20h"来终止程序(原因你可以自己去查查书),而应使用推荐的方式mov ah,4ch int 21h

我认为大学的计算机教育有很多问题,其中之一就是教出来的不是程序员,不过解决你现在问题的方法是多看几本书,对于代码自己多去想想。
要记住,计算机不是高级的计算器(我的许多同学学完大学里的编程课程后认为编程只是为了科学计算用),编程的目的在于软件,在于应用,在于让计算机为我们服务。
psprite 2003-10-17
  • 打赏
  • 举报
回复
呵呵,小皮用的是debug,因为初学所以还没开始用TASM
不过还是要再次谢谢 qingjin
为什么要用xor al,al提供时延呢?我只知道xor al,al的与非能让al清零
int 20的使用条件是什么?是要打开中断响应吗?
呵呵,qingjin别闲我问的多,有些老师和书上讲的都不全面的,我只想学的细一些
麻烦了!
qingjin 2003-10-17
  • 打赏
  • 举报
回复
首先,最重要的错误是
out的用法: out 端口,!累加器!;也就是说,必须用out 端口,al或out 端口,ax
in也一样
其次,CMOS只提供64个字节单元啊,可是你却循环了256次!
再次,汇编编译器中默认的数制是十进制,上述一些数值应该加h
再次,没有延时。也许下面程序中xor al,al可以提供时延,但是书上还是加了jmp $+2
再次,可以把两个变动的变量合成一个
最后,要学会@@标号的使用,这样在问问题的时候就方便了许多

所以,最终程序如下
mov cx,0040h(用mov cl,40h...dec cl jnz也可啦,只不过这里我想用loop啦)
@@1: mov al,cl-1
out 70h,al
xor al,al
jmp $+2
out 71h,al
loop @@1

请注意int 20的使用条件
psprite 2003-10-16
  • 打赏
  • 举报
回复
谢谢上边的兄弟,那给CMOS清零,这样改可以吗?
MOV CX,0000
MOV AL,CH
OUT 70,AL
OUT 71,00
INC CH
DEC CL
JNZ 0103(跳转到MOV AL,CH)
INT 20
qingjin 2003-10-16
  • 打赏
  • 举报
回复
两年没上CSDN了,这是第一次上

1.您用过反汇编工具吗,比如说Turbo Debug
xor ax,ax 反汇编后是33c0,2字节
mov ax,0000 反汇编后是b80000,3字节

另外,执行前一条命令用的CPU时间比后一条命令少(各自具体的CPU时间我忘记了)
所以,xor ax,ax无论在时间上还是在空间上都优于mov ax,0000

同理,我们可以用xor eax,eax、xor cx,cx、xor dl,dl取代mov eax,0、mov cx,0、mov dl,0 等等

这种优化的取代指令有很多,你可以上网去找找。

2.这位兄弟用的是什么书啊,上面没讲吗?好像您对这些代码的理解也有一些问题
现在我就从头说简要地说一下CMOS的存取原理和方法吧
存取CMOS涉及到两个端口70H,71H
CMOS提供64个字节的RAM单元,分配如下

位移 0 1 2 ... 30-3f
用途 秒 报警秒 分 ... 其它

使用方法:
先把CMOS单元地址送70H,送70H端口相当于“选通”“选定”,然后想读CMOS,就从71H端口读 in al,71h;想写CMOS,就对71H端口写 out 71h,al 。

代码例子:
(1)读代码片段
mov al,n ;n是单元地址
out 70h,al
jmp $+2 ;延时
in al,71h
(2)写代码片段
mov al,n
out 70h,al
jmp $+2
mov al,m
out 71h,al
浩曦 2003-10-16
  • 打赏
  • 举报
回复
1.XOR是什么操作呀?就是相同就为'0',那么自己和自己进行这种操作,自己和自己还能不同吗?那么得到的结果将是什么?也就是'0000'咯.还有,用mov ax,0000这种方式并不理想,如果直接用XOR AX,AX或者SUB AX,AX效率是最高的,就用了一个寄存器,当然还是在CPU内部,多快啊

我也才学,也就知道这些了.也不知道对多少

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧