如何快速看懂汇编语言程序

如何快速看懂汇编语言程序,第1张

首先得了解汇编指令吧,其次得用机器的逻辑思考问题,明白其中的存储、累加、判断、转移等概念。

比如,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等 *** 作系统则通过驱动层进行多级抽象提供 *** 作界面给编程人员,编程人员再进一步封装出对话框或全屏文字菜单或流式(行式 *** 作) *** 作界面给最终用户。

程序=算法+数据结构

程序就是一系列有序执行的指令集合。

第一个答案对于大多数人其实等于没有回答,因为算法这个概念可能是一个比程序更为复杂的概念。

第二个答案算是有点容易明白,但还不能让人明白程序能做什么不能做什么。

一,菜谱

材料: 五花肉半斤,尖椒一个,青蒜4-5根,(其实正宗的回锅肉还要放豆干,再放根红椒点缀,咱家没有,省略了),白糖2茶勺,生抽1汤勺,盐2克,鸡精,料酒,姜片,葱段;蒜片,郫县豆瓣酱1汤勺

做法: 预先处理:将整块五花肉放入热水中煮熟(筷子扎下去可以扎透),期间点些料酒,放两片姜,两三段葱;然后放入冷水中冷却。其中,冷水中冷却的步骤可以使肉快速收缩,帮助成型,增加嚼劲儿,是普通厨子变大厨的关键步骤,不可省略哈。

青椒切菱形段,青蒜拍一下蒜头,切寸段。蒜头和蒜叶分开放。

预先处理过的五花肉切薄片,越薄越好。俺就这刀工了,算比较厚的啊。

蒜拍碎(没拍),郫县豆瓣剁成茸(碎点儿好看也好吃)。团脊

处理好的肉片下油锅,旺火煸炒。直至肉片打卷,变得焦黄。

将超好的肉片拨至一边,下入蒜末和郫县豆瓣,用小火炒出红油。

倒入尖椒段和青蒜蒜头,烹入糖,生抽,盐。注意:郫县豆瓣酱和生抽均有咸度,盐一定要酌情放。

待尖椒和蒜头香味出来,放入青蒜叶及鸡精兜匀。青蒜叶熟的很快,这个步骤只需要30秒或者更短,只要看到青蒜叶被油裹住就可以了。

出锅

以上是网上找的一个回锅肉的菜谱(貌似这个下酒好)。从广义的角度来说这也是一个程序,怎么说呢?

这个程序与计算机程序略微不一样,这个程序的运行者是一个可以认识上面的文字,能正确理解每句话的意义,且有能力得到材料并按步骤执行的人。而计算机程序则是计算机可以理解和执行语句。

二,为什么要有编程语言

就像上面的菜谱一样,我们只要识得汉字基本都可以照着来执行。为什么要有让人看起怎么都不能一下就接受的编程语言呢?

自然语言有歧义

男老师发现一女生上课睡觉,气愤的说:我在上面累的要死,你在下面一动不动!不配合也就罢了,连点反应都没有,将来要是肚子里没东西,可别怪老师不行!

中国足球队谁也打不赢。中国乒乓球队谁也打不赢。

冬天太冷,出门时衣服能穿多少就穿多少。夏天太热,出门时衣服能穿多少就穿多少。

地铁里听到一个女孩大概是给男朋友打电话,“我已经到西直门了,你快出来往地铁站走。如果你到了,我还没到,你就等着吧。如果我到了,你还没到,你就等着吧。”

老婆给当程序员的老公打电话:下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。当晚,程序员老公手捧一个包子进了家门…老婆怒道:你怎么就买了一个包子?!老公答曰:因为看到了卖西瓜的。

这是几则最典型的汉语歧义,其它语种中一样有很多这样的歧义。看最后程序员这则,那么就是老婆下了一系列指令但是执行者按照另一种意义去执行了。当然这例子还有不恰当的地方,我们也可以将指令改为:“下班顺路买一斤包子带回来,另外如果看到卖西瓜的,买一个西瓜。”。但是麻烦就在汉语本身并未限制我们必须如此,另外其它例子中的用法那就更加不容易确定意义了,还牵扯到语境。所以到今天为止计算机在处理自然语言上都还很糟糕。

自然语言不稳定

666, 虾米, 酱紫, 沙发, 粉丝

以上这些词语在有了网络后就多了一层意思,不上网的人可能根本不知道这多出一层意思。当然不稳定本质上还是带来歧义。

因为这些原因才有数学语言(其实一样有歧义,不然就不会产生数理逻辑这个分支了)、编程语言来规避歧义。

三,程序是什么

这真是一个不好下定义的词,比较可靠的回答都要涉及数理逻辑。无论是递归函数论、图灵机模型、lambda演算都不是那么容易掌握的。这些远比学一门编程语言及掌握写程序更难。所以在这里我们先只给出一个形象的比喻,程序就是一段编译器或解释器(这东西可能比任何人都要听你的话,只要你能用它懂的语言来指挥)能听懂的指令。

打开微信我们可以指挥微信,我们可以给好友发信息,可以加好友,可以发朋友圈,我们下什么指令它就做什么,我们下指令是通过点击屏幕。而编译器与解释器也是类似的东西,不过这东西它只接受它认识的指令,它接受指令都是文字(主要是英文,数字,标点)。

四,计算、同构、模拟颂顷

对于同一件事比如我们要计算3+5,那么我们可以有:

扳着手指头左手3个,右手5个放在一起是8个手指头

先拿出3个小球,再拿出5个小球放在一起是8个小球

我们在计算器输入3+5得出8

这三个方法都可以计算出野或陆3+5的值,他们用了不同方法的形式但在对于计算3+5这个核心上是计算等价的。也就是同构的概念。

有了同构我们就可以模拟了,比如你有小球,拿它做了一次加法运算。但是我没有小球我可以用手指头或者石子来代替小球模拟你用小球做加法运算,并且得出和你一样的结果。

我们是怎么用程序来事的呢?主要就是用计算机中的数据来模拟现实中的东西。

比如摄像头中的你脑袋往左移了一下,那么本质上计算机中代表脑袋的那些数据的x坐标减去了一定的值,最终再输出到显示器上。

比如你在纸上解了一个方程,那么在计算机也有一个模拟你每一步的计算的过程来得出和你一样的值。只是你用纸和笔来进行,而计算机用它的方式来进行。

先理解各个子程序实验的目的,再慢慢了解每条指令在程序中起到的判兆禅作用!

如:下掘尘面是一个延时子程序,

(汇编)

DELAY:MOV

R0,#20

LOOP:

MOV

R1,#250

LOOP1:DJNZ

R1,LOOP1

DJNZ

R0,LOOP

RET

先要知道这段程序的作用!延时?是怎么实验延时的.

然后分析:

DELAY:MOV

R0,#20给R0送20次;

LOOP:

MOV

R1,#250给R1送250次;

LOOP1:DJNZ

R1,LOOP1将R1的内容减一不等于零就条转到LOOP1等于零就执行下一条指令

 (意思是说要执行这条指令250次)

DJNZ

R0,LOOP将R0的内容减一不等于零就条转到LOOP等于零就执行下一条指令

 (把LOOP:

MOV

R1,#250;LOOP1:DJNZ

R1,LOOP1这两条指令执行20次)

RET

 ;循环结束返回

你认真算一下这段程序一共执行的多少条指令;一共是5000+2条指令;由于执行"DJNZ

"这条指令要两个机械周期!假如晶振为12M那么执行一条需要猜弯2us;

这段程序的作用是延时2us*(5000+2)既10MS

理解程序最好由大到小

祝你早日成功!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8184168.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存