汇编第一次实验

DOS环境下编译

(1)将下面的数据段输入,取名1.asm,保存在MASM文件下。生成.lst文件,用EDIT查看1.lst文件。

​ ①首先用cmd且将目录转移到MASM文件夹下

01

​ ②打开EDIT将代码输入并保存

02

​ ③再通过MASM打开刚生成的.asm文件并生成对应的.lst文件

03

​ ④最后再打开EDIT查看刚生成的.lst文件

(2)输入下面的错误文件,修改错误语句(MASM没有出现错误即可,不必连接、运行)

​ ①同样再MASM文件夹下运行cmd并打开EDIT,将代码输入并保存

04

​ ②再通过MASM打开对应的.asm文件,cmd中会显示刚才代码中的错误以及对应的行数(显示的错误信息可查阅课本的附录)

05

​ (例如图中显示发现7个错误,分别在9、10、14、15、16、17、21行)

​ ③对照显示的错误信息打开EDIT进行修改代码,结果如图所示

06

(3)输入下面的程序并运行

​ ①同样再MASM文件夹下运行cmd并打开EDIT,将代码输入并生成对应的.asm文件,输入结果如图所示

07

​ ②通过MASM中打开刚生成的.asm文件并生成对应的.obj文件

08

​ ③再通过link.exe打开刚才的.obj文件并生成最终对应的.exe文件

09

​ ④最后在cmd中运行生成的.exe文件

10

汇编语言中的标志位:CF、PF、AF、ZF、SF、TF、IF、DF、OF

CF:进位标志位。在无符号运算时,记录了运算结果的最高有效位向更高位的进位值或从更高位借位,产生进位或借位时CF=1,否则CF=0;

PF:奇偶标志位。相关指令执行后结果所有bit中1的个数为偶数,那么PF=1,1的个数为奇数则PF=0;

AF:辅助进位标志位。运算过程中看最后四位,不论长度为多少。最后四位向前有进位或者借位,AF=1,否则AF=0;

ZF:零标志位。相关指令执行后结果为0那么ZF=1,结果不为0则ZF=0;

SF:符号标志位。相关指令执行后结果为负那么SF=1,结果非负数则SF=0;

TF:调试标志位。当TF=1时,处理器每次只执行一条指令,即单步执行;

IF:中断允许标志位。它用来控制8086是否允许接收外部中断请求。若IF=1,8086能响应外部中断,反之则屏蔽外部中断;

DF:方向标志位。在串处理指令中,每次操作后,如果DF=0,si、di递增,如果DF=1,si、di递减;注意此处DF的值是由程序员进行设定的 cld命令是将DF设置为0,std命令是将DF设置为1;

OF:溢出标志位。记录了有符号运算的结果是否发生了溢出,如果发生溢出OF=1,如果没有OF=0;

switch分支语句

Switch分支

​ Switch分支:有一组情形存在,通过同一条件,通常有多个值,但是每一个值都会有对应不同的代码要执行。

​ Switch判断方式:是将条件放到分支结构内部判断

​ Switch基本语法:

Switch(条件表达式){

//所有条件判断:逐个执行

Case 值1: //当前条件表达式的结果与值1相等(==)

要执行的代码段;

Break; //在switch中,如果条件匹配成功,那么系统就不会再次匹配条件,会自动顺序执行向下的所有代码(case代码除外),需要中断执行:break表示中断switch(结束)。

Case 值2:

要执行的代码段;

Break;

...

//可以使用类似else的语法:都不匹配

Default:

//匹配失败的代码;

Break;

}

​ if和switch的选择:

1、if能做所有的分支结构事情

2、switch处理的是条件比较多,同时比较单一,而且是固定值匹配的分支结构

if分支介绍

流程控制

​ 流程控制:代码执行的方向

控制分类

​ 顺序结构:代码从上往下,顺序执行。(代码执行的最基本结构)

​ 分支结构:给定一个条件,同时有多种可执行代码(块),然后会根据条件执行某一段代码

​ 循环结构:在某个条件控制范围内,指定的代码(块)可以重复执行

顺序结构

​ 顺序结构:最基本结构,所有代码默认都是从上往下依次执行

分支结构

​ 在PHP中,分支结构主要有两种:if分支和switch分支

if分支

​ if:如果的意思,给定一个条件,同时为该条件设置多种(两种)情况,然后通过条件判断来实现具体的执行段

​ 基本语法:if分支PHP也提供多种方式来实现

​ 最简if:只有一段代码,但是可以选择是否执行

if(条件表达式){

//满足条件所要执行的内容;//顺序结构

}

​ 基础if:有两面性,满足条件或不满足条件都有对应的执行代码

if(条件表达式){

//满足条件后执行的代码段;

}else{

//不满足条件执行的代码段;

}

​ 复杂if结构:在判断条件之后,通常就有两种结果:满足或不满足,在不满足之后还可以再次进行条件判断

if(条件表达式1){

//满足条件表达式1的代码段;

}elseif(条件表达式2){

//不满足表达式1条件,但是满足表达式2的代码;

}... //可以使用多个elseif来进行再次条件筛选

else{

//全部不满足要执行的代码:

}

​ 注意:如果条件特别多才会采用复合if形式

1、如果条件比较单一(同一个条件),会采用elseif复合方式

2、如果判断条件不一致,建议使用嵌套语法(不宜有太多层嵌套:影响代码美观)

if分支适用于所有的条件判断(分支结构)

计算机码位运算符运算符优先级

计算机码:计算机在实际储存数据的时候,采用的编码规则(二进制规则)

计算机码:原码、反码和补码,数值本身最左边一位是用来充当符号位:正数为0,负数为1

原码:数据本身从十进制转换成二进制得到的结果

​ 正数:左边符号位为0(正数的原码、反码和补码就是原码本身)

​ 负数:左边符号位为1

反码:针对负数,符号位不变,其他位取反

补码:针对负数,反码+1

01

02

位运算符

​ 位运算:取出计算机中最小的单位(位bit)进行运算

03

​ 注意:

1、系统进行任何位运算的时候都是使用的补码

2、运算结束之后都必须转换成原码才是最终要显示的数据

​ 按位左移:乘以二的操作

​ 按位右移:除以二的操作(不完全正确:整数除以二会出现小数)

运算优先级

运算符优先级:在多种运算符同时存在的时候,如何结合运算。

04

运算符优先级自上而下降低

自操作运算符

自操作:自己操作自己的运算符

++:在原来的值上+!

–:在原来的值上-1

$a=1;

$a++;//$a=$a+1;

在PHP中自操作符是可以放到变量前或后:前置自操作和后置自操作

$a=1;

$a++;

++$a; //前置或者后置如果本身只有自操作,不参与其他运算(自操作同时),那么效果是一样的。但是如果自操作同时还参与别的运算,那么效果就不一样

$a=1;

$b=$a++; //$a++会导致$a=$a+1;$a=2,上面的$b=1

$c=++$a; //++$a会导致$a=$a+1;$a=2;$c=2;

前置自操作:先把自己改变,然后把改变后的值给别人。

后置自操作:先把自己所保存的值留下来,然后改变自己,自己给别人 的值是原来的值。

01

​ 衍生符号:类似自操作

02

​ 注意:右边是一个整体$a+=$b;➡$a=$a+($b);

​ 如果进行除法或者取余运算,那么要考虑右边表达式的结果是否为0(为0出错)

连接错误抑制三目运算符

连接运算符

​ 连接运算:是PHP中将多个字符串拼接的一种符号

. :将两个字符串连接到一起

.= :复合运算,将左边的内容与右边的内容连接起来,然后重新赋值给左边变量

A.=b ===== A=A.b

01

错误抑制符

在PHP中有一些错误可以提前预知,但是这些错误可能无法避免,但是又不希望报错给用户看,可以使用错误抑制符处理。

@:在可能出错的表达式前面用@符号即可

02

错误抑制符通常在生产环境(上线)会用到,在开发的时候不会用:系统本身最好没有任何错误。

三目运算

三目运算:有三个表达式参与的运算(简单的分支结构缩写)

语法格式:

表达式1?表达式2:表达式3;

运算:如果表达式1成立,那么执行表达式2,否则执行表达式3;

注意:如果表达式本身比较复杂,建议使用括号包起来。

03

三目运算可以进行复合三目运算:三目运算中的表达式2和3都可以是另外一个三目运算。

表达式1?(表达式2?表达式4:表达式5):(表达式3?表达式5:表达式6);

逻辑运算符

逻辑运算:针对不同的结果进行匹配

&&:逻辑与,左边的条件与右边的条件同时成立(两边结果都为true)

||:逻辑或,左边的条件或右边的条件只要有一个满足即可

!:逻辑非,对已有的条件进行取反,本身为true,取反结果就是false

01

​ 逻辑与和逻辑或又称之为短路运算:如果第一个表达式结果已经满足条件了,那么就不会运行逻辑运算符后面的表达式:在书写代码的时候,尽量将出现概率最高的(能够直接判断出结果)的表达式放到第一位。

赋值算数比较运算符

运算符

​ 运算符:operator,是一种将数据进行运算的特殊符号,在PHP中一共有十种运算符之多

赋值运算符

赋值运算:符号是“=”,表示将右边的结果(可以是变量、数据、常量和其他运算出来的结果),保存到内存的某个位置,然后将位置的内存地址赋值给左侧的变量(常量)。

算数运算符

​ 算数运算:基本算数操作

01

比较运算符

比较运算:比较两个数据的大小,或者两个内容是否相同,返回的结果都是布尔类型:满足返回true,不满足,返回false

02

整数类型进制简介

整数类型

​ 整数类型:保存整数数值(范围限制),4个字节储存数据,最大就是32位:42亿多。但是在PHP中默认是有符号类型(区分正负数)。

​ 在PHP中提供了四种整形的定义方式:十进制定义、二进制定义、八进制定义和十六进制定义

$a=120; //10进制

$a=0b110; //2进制

$a=0120; //8进制

$a=0x120; //16进制

01

02

​ PHP提供了很多的函数进行进制转换:

03

浮点类型

​ 浮点型:小数类型以及超过整型所能存储范围的整数(不保证精度),精度范围大概在15个有效数字左右。

​ 浮点型定义有两种方式:

$f=1.23;

$f=1.23e10; //科学计数法,其中e表示底10

​ 尽量不用浮点数做精确判断:浮点数保存的数据不够精确,而且在计算机中凡是小数基本上存的都不准确。

布尔类型

​ 布尔类型:两个值true和false,通常是用于判断比较。

​ 在进行某些数据判断的时候,需要特别注意类型转换。

04

,