计算机世界的高级语言都是从无到有的过程,汇编是将繁琐难记的二进制语言,用助记符的形式予以代替,从而使计算机变得更加容易控制。编程也更容易实现了。后面接下来的高级语言则更像自然语言了。
汇编语言指令格式:
由4部分组成:
[标号[:]]指令助记符 目的操作数,源操作数[;注释]
标号表示该指令在主存中的逻辑地址
每个指令助记符就代表一种指令
目的和源操作数表示参与操作的对象
注释是对该指令或程序段功能的说明
汇编指令第一大类:数据传送指令
数据传送指令共有12条:MOV(最常见)
PUSH POP (联合对堆栈进行操作)
XCHG(两个数据交换)
XLAT(换码指令‘可以加密) LEA(有效地址(只是偏移量)传送)
LDS (加载数据寄存器,少用) LES(加载附加段寄存器 少用)
LAHF SAHF(标志寄存器传送,为了与8086兼容,现在基本不用)
PUSHF POPF(标志寄存器传送)
上述指令主要是完成对数据的传送,除操作标志位寄存器外,其余传送指令皆不影响标志位。
汇编指令第二大类:算术运算指令
算术运算当然不外加减乘除了,注意算术运算对标志位的影响。下面是常用的和主要的
加法指令 ADD/ADC/INC、 减法指令SUB/SBB/DEC/ NEG(求补)/CMP(不改变结果,但影响标志位)
乘法指令 mul/imul(有符号) 除法指令 div/idiv(有符号)
汇编指令第三大类:逻辑运算指令
逻辑非 NOT 逻辑与 AND 逻辑或 OR 逻辑异或 XOR(这个可以做加密哦,两次异或二进制又成为和原文一模一样了,呵呵) 逻辑测试指令 TEST (进行逻辑与运算,不改变结果,改变标志位)
逻辑指令提供了对二进制位的操作,可以窥测到计算机的底层。
汇编指令第四大类:移位操作指令
逻辑移位:shl(逻辑左移) shr(逻辑右移)
算术移位:sal(算术左移) sar(算术右移)
不带进位循环移位:(rol)(ror)
带进位循环移位:(rcl)(rcr)
移位指令对标志的影响:
CF:按移入的移位设置
SF\ZF\PF:根据移位的结果设置
AF:没有定义
OF:根据最高有效位设置(如果移位前后操作数的最高有效位不同则OF=1,否则OF=0):主要是针对移动一位时,若多次移位则未知
汇编指令第五大类:状态标志位操作
CF 清零clc 置位stc (df、if指令类似)
汇编指令第六大类:代码跳转指令
JMP call loop ret
代码跳转指令很重要 计算机没有了他们就只能一条直路通到底了 那跟计算器没什么区别
汇编指令还有很多,但只挑这些与计算机思考的方面来说 计算机到底能干什么呢?
高级的语言编出的程序可以完成很多的工作,但归根结底他们都是有一块一块砖垒起成了高楼大厦。
从上面所汇总的基本汇编指令来看,cpu到底能做什么呢?
第一,给数据挪窝,方便cpu处理;第二,加减乘除,哲学讲那就是量变引起质变;第三,深入底层,改变状态和操作二进制,改变程序流程。流程改变了那才能做点大事。 cpu两大部件 算逻运算部件 控制部件 进行处理这些指令和数据
呵呵计算机绝对不是万能的。
它是有限制的。算法能不能实现就是限制它的条件。当然你可以搞个无限循环来着 但那有什么意思呢!
算法是程序的灵魂。算法定义自己找下,比较的复杂 呵呵
一个算法应该具有以下五个重要的特征:
1、有穷性
这个太重要了,虽然微软的操作系统就设计成一个无限循环(时刻等待着你的操作),但它也是有穷的,你一关机,它就不循环了
2、确切性
模糊不仅是表现性的天敌也是计算机的天敌。确切的定义意味着计算机准确的自动控制
3、输入
一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件;
4、输出
一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
5、可行性
算法中执行的任何计算步都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成。
所以计算机按照算法来进行自我的间接控制。然后把你想要的结果给反映出来 可以显式的(在屏幕是显示)可以是隐士的(在寄存器或ram中等待被召唤) 但计算机能操作的是二进制语言,它的智能就是虚拟,都不是物质的。不考虑硬件是物质的。
它的智能的基础就是量变(比如算术的加减)和突变(比如程序跳转)引起表象的变化。
除此之外,它无能为力。
二进制和八卦同根同源 同出一门,现在很多研究易经的人都认为易经广大悉备 博大精深 计算机把易经发扬光大了。
其实他两的倒真有许多相同之处。
易经中一阴一阳为之道,
计算机中一加一减为之变。
呵呵
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)