首先得了解汇编指令吧,其次得用机器的逻辑思考问题,明白其中的存储、累加、判断、转移等概念。
比如,1+2+....+100这样的问题,虽然我们可以给出公式计算,但机器并不知道,它只能知道,而且只能每次做一个加法,而且鉴于CPU的架构不能存所有的这些数值-如果这些数量不定的话更复杂,比如这些数是放在一个内存区域的,内存区域约定如下:第一个数表示总共有多少个数,后面是相应的数据,在这些数没有规律时是不能用公式的。
另外,许多CPU约定只有一个累加器(同时也是一个寄存器,假设它是寄存器AX),它允许从内存读一个数(MOV或者LD指令),只能进行内存数据加法(ADD [地址])。
于是我们只能这样,首先设置指针寄存器BX:
start: mov BX,#地址 ; 设置内存区域起始地址,保存在BX中
mov CX,[BX]; 取出总数到CX中,假设CX可以做简单递增或递减
dec CX ; 预减一次计数器,因为加法只需做CX-1次
inc BX
mov AX, [BX]; 取出数据
loop: inc BX ;递增BX,使之指向真实数据
ADD AX,[BX];用下一数据进行累加,并将结果保存在AX中
dec CX ;假定这个减法会影响标志位ZF
JNZ loop ;如果没有减到0就继续loop到这里之间的操作
mov [BX], AX; 保存累加结果到数据区的尾部
HALT ; 停机
可以看出,上述代码并不能告诉我具体结果是多少,除非我们通过工具去访问这一内存区域,于是一个系统会设计出来专门让我们进行基本的输入输出,把计算机的内部情况甚至内存情况通过I/O口送出来,这些IO设备,比如键盘负责接收我们的机器指令(可以是汇编结果,也可以是高级语言产生的二进制指令和数据流),把结果输出到打印机或者CRT这样的输出设备上(通常映射为端口,IO PORT)。这就是BIOS完成的工作,如int 8负责时钟,int 10负责屏幕,int 16负责键盘等等。更进一步,可以进一步封装称DOS调用,如int 21负责基本的输入输出包括文件操作等等。WINDOWS等操作系统则通过驱动层进行多级抽象提供操作界面给编程人员,编程人员再进一步封装出对话框或全屏文字菜单或流式(行式操作)操作界面给最终用户。
有些人编写的小程序没有分段落、注释也不清楚。可以先将其编译链接生成可执行文件,再用SR.exe等反汇编工具进行反汇编。反汇编出的原程序会自动分段、自动加上很多的注释,可以帮助你快速看懂程序。
找到汇编语言指令手册,看到什么指令不明白就查,这样肯定是最快的方法了,但是要求你有比较好的理解领悟能力。 首先你应该对基本的寄存器有个大概的了解,另外大致了解一下汇编程序基本的执行过程,这并不要花费多少时间的。
就象学一门外语,要看懂,得先弄清楚英文单词的意思,然后是句话的意思,然后是一段话的意思,……最后整篇文章也就差不多弄明白了。所以要先熟悉那些常用的语句,一些基本的程序结构,一本可以象查英文单词一样查阅的汇编语言书。
个人没什么敲门,
看汇编程序,都是一行一行的看。
必须的记住每一条命令的功能,和效果。
然后就是看程序的命名,和注释了。
然后就是能操作看到实际的执行效果。