汇编网首页登录博客注册
fishboy的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态

[2007-10-18 10:19] 推荐博文 初学汇编易犯的N个错误

1.段的定义不完整:
定义一个段空间的格式为:
 segName segment
 ....
 segName ends
一般首行很少出错,但是,有时候段体内容多了,忘了段结束的 edns了。^_^
2.代码段的起始指令错误:
code segment
start:
mov ax ,1
s:
mov ax , 2
code ends
end s
在上面这段代码中,程序执行从标号s开始,因为在源代码的最后一行“end s”指明了代码开始的位置是s处,而不是start处。做过检测题的朋友们,应该还有印象吧。start只是个标号,没有之外的任何意思,反倒是“end”定义了代码执行的开始。
3.段地址寄存器与立即数进行操作。
    在汇编中类似“mov ds , 1”的指令是不合法的,段地址寄存器不能和立即数进行直接操作,必须利用其他寄存器进行。如“ mov ds,1”应该为“mov ax,1 / mov ds,ax”。
4.关于[idata]的错误:
    《汇编语言》一书中已经明确了[idata]在debug和masm中不同的编译处理。在masm编译中,类似 mov ax ,[idata]的操作,其等同于mov ax,idata。还有,在论坛中有的兄弟写下如下代码mov word ptr [100] ,200或者mov byte ptr [100] , ah ,诸如此类的吧。可能是认为默认段地址是ds吧。那就错了!ds被默认成段地址,是对于某些寄存器被使用寻址的情况。mov [idata] , opdata这样的命令将被masm看成mov idata , opdata,向立即数里写入内容,显然是不合理的。所以建议,在寻址操作的时候,不要省略段地址。
5.前后操作数的大小不一致:
    最典型的就是类似 mov ax,bl这样语句。当然,如此明显的错误发生的几率比较小,但是类似 mov ds:[bx] , 1这样的语句估计差不多每个学习汇编的人都写过吧?记住,计算机不是你肚子里的蛔虫,他不知道你到底要干什么。在寻址操作数据的时候,一定要明确操作数据的大小,如mov word ptr ds:[bx],1和mov byte ptr ds:[bx],1都是合法的。但是如果过于保守了,在 mov al,ds:[bx]这样的语句也写成mov byte ptr al,ds:[bx]的话,就有点矫枉过正了。因为第一个操作数al已经表明了操作数据的大小了,你画蛇添足的做法,在masm6.0下不会有什么问题,但是,在masm5.0的编译过程中,会出Erro的。所以,汇编是一个精细活,该做的做,不该做的别做。
6.立即数前面的“0”:
    我们发现,在我们的立即数的第一位是字母的时候,我们必须给这个立即数最前面加上一个“0”,如0AH,0B800H。这是为什么呢?引用happy的一个经典例子“mov bh ,ah”这个指令你知道是怎么理解吗?bh,ah到底是代表的寄存器的高位呢,还是代表的立即数呢?也许这个例子在masm环境下有不妥之处,但是,很直观的看出了立即数前加“0”的作用和意义,防止意义混淆。
7.跳转语句的限制。
    我们在学习中知道,跳转语句是基于偏移量的。各个跳转语句的偏移量是不相同的。比如je的偏移量是 -127~128,我们经常忽略这些偏移量的概念,让一个只能跳1米的人去跳一个2米的河,结果可想而知。解决的办法当然是找个更大偏移量的来解决了。比如je a 超过了8位的数据偏移量了,我们就用一个16位的来曲线救国,“je b /b:jmp a”。问题解决,但是,我们还得将跳转语句的跳转原理植根大脑,时刻警惕,不然不知道就跳到哪个自己挖好的坑里了。
    洋洋洒洒的写了这些,在汇编学习中还有不少问题出现,希望大家都来补充,给新的学习者一个警醒,借前车之鉴,少走弯路。
=======================================================
0o天空是翅膀的舞台o0
评论次数(8)  |  浏览次数(2826)  |  类型(汇编自留地) |  收藏此文  | 

[  mqmelon   发表于  2007-10-18 11:22  ]

好文章!的确如此,很多错误我就犯过了。

[  游客   发表于  2007-10-18 11:50  ]

好帖
先顶了

[  opened   发表于  2007-10-18 13:16  ]

不错,对需要大家注意的点的总结.谢谢 ..从上面说到mov [idata] , opdata,这里,我认为养成良好的程序编写习惯也很重要.

[  cxn   发表于  2007-10-18 17:37  ]

mov bh ,ah
这个例子很经典.

好文章 不错!

[  Wednesday   发表于  2007-10-19 11:24  ]

我发现,借来的“前车之鉴”是最不好使的。

还是自己的实践体会更深刻。

[  游客   发表于  2008-02-29 17:03  ]

不错。确实是初级选手容易犯的错误。

[  infosecer   发表于  2010-07-17 00:16  ]

受教了

[  游客   发表于  2011-07-22 16:20  ]

补充一下,还有可能在数据段中定义数组时超过了一个段长

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码