- [游客] 补充一下,还有可能在数据段中定义数组时超过了一个段长 07/22 16:20
- [infosecer] 受教了 07/17 00:16
- [游客] 顶一下。 05/06 19:00
- [maxm] 收藏了先 02/17 15:50
- [jcw2008] 谢谢,这对我很有用! 10/21 11:05
- [ding2843] 好文章。。。。。。。。。。。。。。。。。 07/01 16:39
- [ding2843] 好文章。。。。。。。。 07/01 16:22
- [starrynight] 一笑而过 管自己的水,让别人喝去吧 06/27 13:25
- [游客] "别理他"那可不行,不能让不实之言,任意泛滥。 知情人应该发言,不要让“谣言”有成长的空间。 06/27 12:55
- [yjll] 顶! 06/26 13:31
- [lonely200808] 你好!我的汇编语言的初学者,在论坛里看到你发言,想和你交个朋友,因为我才开始自学,要自考,有没有QQ 03/26 17:19
- [gecko] 接触到汇编语言是一年后的事情了。才知到有一种语言更低级。 这话有双关语的感觉..哈哈 11/21 19:42
- [lbhn] 我已修改了,这东西不注意还真不好找*-* 10/18 16:04
- [lbhn] 多谢了,对了问一下你的照片是怎么上传的?为什么我现在连自己的资料都不能修改了? 10/17 18:28
- [lbhn] 我第二天又做了一遍这次没出错,可能是V86运行程序不是很稳定,多谢你关注啊!! 10/15 16:22
- [lbhn] 你是在纯DOS下还是ms-dos窗口下?是自已的机子吗? 我这是在网吧里做的!! 10/13 13:50
[2007-10-18 10:19] 初学汇编易犯的N个错误
定义一个段空间的格式为:
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
[ 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 ]
补充一下,还有可能在数据段中定义数组时超过了一个段长