这篇blog用于记录我在学习计算机工程系统导论时,一个与网络有关的实验。
用不超过200字简要概括ping命令
ping命令用于向主机或网关发送请求,使用的是ICMP协议的ECHO_REQUSET数据包,并且会接收ICMP ECHO_RESPONSE作为回应。其中ECHO_REQUSET数据包包含了IP和ICMP头部,其后是一个timeval结构以及若干的填充字节。ping命令支持IPv6以及IPv4协议,其中对IPv6节点的信息查询是根据RFC4620进行的,但是由于IPv6源路由被起用,中间跳点可能不被允许。man ping
结果如图1所示
说明实验现象背后的原因
我使用ping命令,分别对www.sud.edu.cn
和www.ouc.edu.cn
进行了10次ping
操作,每次都发送了56字节的数据包。从结果可以看出,到www.sud.edu.cn
的网络连接是通畅的,每一次都成功受到了回复,没有丢包发生。但是延迟时间在10.9ms-170ms之间不等,这可能是由于网络拥塞或者其它网络干扰因素导致的。但是发送到www.ouc.edu.cn
始终没有得到回复,可能是因为OUC的网络配置了防火墙或者其它网络安全策略,阻止了ping
请求。
实验现象如图2所示
通过查询资料,画出所使用ICMP数据包的结构
其中相关部分说明如下
(1)Type,8bits,用于指定ICMP消息类型,例如0表示Echo Reply
,8表示Echo Requset
(2)Code,8bits,用于对消息类型进行更详细的说明,例如目的地不可达,网络不可达等等
(3)Checksum,16bits,用于错误检查
(4)Identifier,16bits,用来匹配请求和响应
(5)Data,可变长度,包含可选的附加数据。
ICMP数据包如图3所示
不超过200字简要概括traceroute命令
traceroute可以用于追踪数据包从源主机到目标主机的网络路径中,它通过发送一个含有TTL字段的IP数据包进行工作,数据包每传递到一个路由器TTL就会减1,当TTL为0的时候路由器就会丢弃该数据包,并给源主机发送一个ICMP(超时响应),其中包含了当前路由器的地址。traceroute在整个工作流程中会从TTL为1开始发送数据包,每次收到ICMP响应后就增大TTL值(2、3、4…),直到收到目的主机的响应。于是根据每一次收到的ICMP响应,traceroute就可以知晓从源主机到目标主机经过的每个路由器,并且显示相应的IP地址和响应时间。man traceroute
结果如图4所示
确定并说明从源计算机到www.baidu.com
的路径
源计算机到www.baidu.com
实现路径探测,结果如下图如下图,一共经过了30跳,其中第一跳172.19.0.1
是源计算机ip,第三、四、五跳10.149.32.1
和10.70.7.2
以及10.90.0.4
是内部网络路由器,之后经过了若干公网路由器,最终到达目标服务器。显示为***
的,可能是由于网络设备被配置为了不响应ICMP请求,所以路径不能完全确定。traceroute www.baidu.com
结果如图5所示
说明输出结果每个字段的意义
(1)traceroute to www.baidu.com (182.61.200.108)
为traceroute命令输出说明,目标的IP地址为182.61.200.108
(2)30 hops max
指最多经过30跳
(3)60 byte packets
指每个数据包大小为60字节
往下是每一跳的详细信息,以第一跳为例
(4)1 1(172.19.0.1) 0.647ms 1.041ms 1.285ms
第一个数字1代表第一跳,172.19.0.1代表第一跳的设备IP,后续三个时间是三个ICMP包的往返时间;后续存在***
的输出对应没有收到该跳的ICMP回复(或者是网络拥塞导致的丢包)。
注:这部分实验,我先是在自己本地的电脑上进行的实验,所以后续的描述是根据本地的输出来的,实验截图也是使用的本地截图
以下按照每一跳对路径进行分析
(1)(1-3跳)
hop1是本地网络,hop2、hop3是私有IP(10.x.x.x),可能对应内部网络路由器、防火墙等
(2)(4跳)
显示为***
,路由器没有响应ICMP请求(或者是丢包)
(3)(5-12跳)
hop5-hop12对应的是公网地址,数据包是在ISP网络中传输的(211.64.x.x和101.4.x.x地址段对应ISP或骨干网提供商,100.64.x.x属于共享地址空间,通常用于ISP内部的网络地址转换)
(4)(13-30跳)
hop13对应***
同样可能没有响应ICMP请求或丢包;hop14开始数据包进入国际网络,延迟有显著的增加(20ms左右,到后续数百毫秒);hop19开始数据包进入了亚洲太平洋先进网络(APAN网络),之后进入了教育和研究网络(Internet2),可以看到最后已经显示出了较高的延迟(200~400ms左右)traceroute 18.31.0.200的输出
结果如图6所示
2. 说明从源地址到www.baidu.com
和到cn.bing.com
的网络路径差异
两者的网络路径在初始几跳上有共同点(除去***
,至少前10跳是相同的),在进入外部网络之后,路径显然会分道扬镳(除去***
,从第14跳开始不相同);到cn.bing.com
后续经过了一些国际骨干网,(例如202.97.x.x的IP地址属于中国电信骨干网),而到www.baidu.com
主要是在国内网络中传输的。traceroute www.baidu.com
与traceroute cn.bing.com
的结果如图7、8所示
3. 如果IPv6上实现路径探测,应该使用包头的哪个字段
在IPv6网络中进行路径探测,主要依赖IPv6包头中的Hop limit字段,这个字段是“跳限字段”,其作用和IPv4中的TTL(生存周期)字段相同,用来限制数据包在网络传输的跳数,每经过一个路由器,这个字段的值都会减1,当减为0后数据包就会被丢弃,并且通常会返回一个ICMPv6的超时消息给源地址。
在实验过程中我主要遇到了问题是在ping www.ouc.edu.cn
始终无法收到返回的结果,掉包率总是100%。经过查阅相关资料,我推测应该是我们学校的服务器配置了防火墙或者其它安全策略,拒绝向ping发送的数据包进行响应。并且我使用traceroute www.ouc.edu.cn
尝试追踪,我发现结果从第7跳开始往后始终都只返回***
,这间接作证了我的猜测。(因为它们都使用的ICMP数据包)
结果如图9所示
Traceroute的主要应用场景有路径发现(它可以用于追踪整个网络路径)、网络延迟分析(可以识别在哪一条引入了延迟,可以判断哪一条延迟较大)、故障点识别(确定数据包在哪一条丢失或无法到达,例如***
的出现可能就是这个原因)、路由问题诊断(找到可能存在的路由环路)、网络性能评估(综合以上功能可以进行网络性能评估)等
(1)修改初始TTL值traceroute -f 5 example.com
使用参数f可以完成这种操作,用来跳过已知的安全路径
(2)设置最大TTL值traceorute -m 20 example.com
使用参数m可以完成这种操作,用于避免弹错过长的路径
(3)修改探测包的数量traceroute -q 5 example.com
使用参数q可以完成这种操作,用来减少或增加探测粒度
其它的还有使用不同的协议、修改探测包的端口号等等
由于网络路由的动态性、负载均衡、多路径路由等因素,网络路径一般是非堆成的,即A到B的路径和B返回A的路径可能会经过不同的路由器以及有不同的跳数。所以一般情况下上述两条路径不会相同
通过本次实验我掌握了ping
和traceroute
命令的基础使用方法,例如traceroute
的一些常见参数的使用(f、m、q、l等)。并且能够分析两条命令的输出信息,例如ping命令输出的掉包率、时延等等,通过这个过程,我更深刻地体会了网络的结构,以及数据包在网络上传递的整个过程。此外我还了解了两条命令的基本实现原理,例如traceroute就是不断通过增大ICMP数据包的TTL,使其能够传播得更远,并每一次都记录返回的响应,最终形成完整的路径,作为信息进行输出。最后,我掌握了ICMP数据包的结构,对数据包有了更加清晰的认识。
在这里记录一些算法题中常见的树的输入方法
*输入格式一
第一行输入一个正整数n,代表树中结点的数量。
第二行输入n个正整数w1…wn,代表i点的权重
接下来n行,每行输入两个整数,其中第i行的li、ri表示i点的左儿子与右儿子,若为-1则表示不存在。
在这里记录常见的树的存储方法
*存储方式一
我们可以使用一个树结点的结构体,通过将这些结构体使用指针连接起来,从而构建一棵完整的树。
1 | struct tree_node{ |
参考文章https://blog.csdn.net/Terie/article/details/111433486
透过这篇博客,我大概了解到了两个点:
pviot:轴心,采用相对坐标系,(0,0)->(1,1),位于某ui的方框内,其表征着在ui被自适应缩放的时候,以哪个位置为标准缩放
锚点:unity提供了三种模式
1、四个锚点合在一起的模式
该模式下,在屏幕分辨率改变的过程当中,ui相对于锚点的位置不改变,ui的宽、高也不变
2、四个锚点两两在一起的模式
该模式下,ui的对应对于锚点连成的线的距离不改变,宽高比不改变,随之缩放
3、四个锚点分开的模式
该模式下,ui的四个边对应锚点连线矩形的四边距离不改变,宽高随着四向距离的改变,自适应。
一般情况下,设置Canvas的UI为随屏幕缩放的模式,理解pivot,记住不同位置的ui常用的锚点模式和放置位置就好。
一下是gpt的建议:
a. 确定元素的锚点
对于屏幕边缘的UI元素(如按钮、面板),将其Anchors设置在父容器的相应边缘。例如:
左上角的按钮:Anchors设为(0,1)到(0,1)
右上角的按钮:Anchors设为(1,1)到(1,1)
底部中央的按钮:Anchors设为(0.5,0)到(0.5,0)
b. 中央对齐的元素
对于中心对齐的UI元素(如中心的面板),将其Anchors设置在父容器的中心。例如:
中央面板:Anchors设为(0.5,0.5)到(0.5,0.5)
c. 保持宽高比例
在Inspector中勾选Canvas Scaler组件的“UI Scale Mode”选项,设置为“Scale With Screen Size”,并设置参考分辨率为你设计时的分辨率(如1920x1080)。这样Unity会根据屏幕分辨率自动缩放UI元素。
1、无人船MMG模型:
一种用于模拟和分析船舶在水中运动行为的数学模型。
MMG模型的基本思想是将船舶的运动分解为船体本身、推进系统(如螺旋桨)和舵等操纵装置的独立贡献,然后将这些贡献综合起来,以描述船舶的整体运动。
主要包括四个部分:
船体动力学模型:描述船体在水中的基本运动特性,包括水动力、惯性力和阻力等。
螺旋桨模型:描述推进装置(如螺旋桨)对船舶的推力和转矩输出,这些输出通常与螺旋桨的转速和船速等参数相关。
舵模型:描述舵对船舶的横向力和转矩输出,这些输出通常与舵角和水流速度等参数有关。
干扰力模型:包括环境中的风、浪、流等对船舶运动的影响。
2、横荡、纵荡和艏摇:
横荡(Sway):
横荡指船舶沿着横向(即垂直于船体中心线)的运动。对于一艘在水中的船舶来说,横荡运动通常是侧向的滑动,可能由于外部作用力(如侧风、侧流或舵面调整)而发生。横荡是三自由度(3-DOF)船舶动力学模型中的一个重要运动分量。
纵荡是指船舶沿着船体中心线方向的运动,即船舶的前进或后退运动。纵荡通常由船舶的推进装置(如螺旋桨)提供的推力驱动。纵荡运动决定了船舶的航速变化,在无人船中,通过调整纵荡速度可以实现对速度的控制和调整。
艏摇是指船舶围绕垂直轴的旋转运动,即船首(艏)左右摇摆的运动。艏摇角度的变化决定了船舶的航向。艏摇运动通常是由舵角调整或推进系统产生的转矩导致的,它是船舶操纵中控制航向的重要参数。无人船的自动导航系统会通过控制艏摇运动来实现精确的航向调整和路径跟踪。
3、航向角 艏摇角 舵角 漂流角 绝对风舷角和相对风舷角
4、无量纲化处理 运动参数和无量纲参数的对应关系
无量纲化处理的核心思想是通过适当选择基准量(如长度、时间、质量等),将物理量转换为无量纲量。这样做的目的是减少方程中的变量数量,揭示系统的内在规律,并使得不同尺度的系统可以进行比较和分析。
选择一组基准量,例如特征长度。无量纲变量的定义:将原始变量除以相应的基准量。
Read more -->海洋技术;
声学:声信号数据处理、算法
光学:仿真、数据处理、算法
遥感:遥感信息数据处理、算法
光科:
光谱、光电结合(单片机)、光学设计等
电子信息:
单片机、算法等
Web of Science、中国知网、ScienceDirect、小绿鲸、截屏翻译APP
刚入门的直接看SCI会比较困难,最好从硕博文章开始看,在看SCI之前最好先看三篇博士文章(600多页)
看英文文章可以用小绿鲸,不用应用软件,用官网主页。截屏翻译、小绿鲸是看SCI时用到的,前期看博士文章最好。
GPT可以用,但是写出来的东西一定要自己看得懂。
zlibrary中有很多参考书,很好用。多运用CSDN、GitHub
国创、省创注意截至日期,中期的时候会有一个机会用来申请国创、省创,最好要把srdp升一个台阶,不要原原本本地交srdp。
理工科相关的公式要熟悉(明白如何推导的,或者说如何产生的)
流程:
10、11月立项(撰写立项书、制作ppt、填写系统、准备立项答辩)->4、5月中期检查(省创国创立项)->10、11月结项(省创国创中期检查)->4、5月省创国创结项
如果目标国创、省创的话最好前期干完百分之60到百分之80,除此之外一定要干满工作量,否则会延期,得不偿失。
选题的话主要看指导老师。
制定开发计划(敏捷开发计划)、迭代开发(要先有一个成果,逐步迭代,迎接变化)、定期开会(要和老师同步)、共同开发
Origin(画图好用)、Latex、MathType(打字母公式)、Office…
小发明、小制作、小设计;实际教学中的综合性、设计性、创新性、应用性课题
Read more -->目前的打算是先更新思路,然后在有图片处空出,后续补充图片。
以int 32位为例
我们清楚,当进行算数右移的时候,对于符号位为1的情况下,右移之后符号位、第32位的1,被移动到31位后,32位右被补上了1
而逻辑右移与之不同的是,逻辑右移后,最高位、32位会被补0
现在要用算数右移实现逻辑右移,看代码:
x = x >> n;
y = ~((1 << 31) >> n << 1);
x = x&y;
1、x符号位为0,算数右移动n位后,x为 0..(n+1个0)XXXXXXX…
2、x符号位为1,算数右移动n位后,x为 1..(n+1个1)XXXXXXX…
而对于逻辑右移n位后,无论x符号位是0还是1,都是算数右移中1、的情况
所以我们只需要:x = x&0..(n+1个0)1111..1就可以将算数右移的结果转换为逻辑右移的结果。
关键在于凑出掩码0..(n+1个0)1111..1,即y处的操作。
分治法的思想:一个复杂的问题分解成若干个规模较小但相似的子问题,“递归”地解决这些子问题,然后将这些子问题的解组合起来,得到原问题的解。
让我们先以8位二进制数为例子:
原问题:11011110 整体这个数(或者说“一”部分)有几个1
分解:求 1101 1110 两部分,分别有几个1
分解:求 11 01 11 10 四部分,分别有几个1
分解:求 1 1 0 1 1 1 1 0 八部分,分别有几个1
显然,对于上一个问题,各个部分的数字0 or 1就代表了这个部分有几个1,即八个部分时各个部分有几个1已经清楚。最小问题的答案已知,考虑如何利用将最小问题的答案合并,求解上层的问题。
注意:“各个部分的数字0 or 1就代表了这个部分有几个1”正是八部分时最大的特点,记住这个特点,因为我们的目标是“让‘一’部分时,该部分的数字就代表该部分有几个1。”
下面开始合并,使用到的关系是:上一个问题中各个部分有几个1 = 当前问题中相邻两个部分1的个数相加
采用上面的关系对问题合并,我们会发现每解决一个问题后,问题中各个部分的数字,就代表原来该部分有几个1。
合并: 四部分状况的问题的答案:10 01 10 01
合并: 二部分状况的问题的答案:0011 0011
合并: “一”部分(原问题)的答案:00000110
根据前面的描述,00000110即原本1的个数。
下面是具体的实现代码
cin>>x
int x1,x2,x3,x4,x5,s,m;
s = x >> 1;
m = ~((1 << 31));
x1 = s&m;
x = (x & 0x55555555) + (x1 & 0x55555555);
s = x >> 2;
m = ~((1 << 31) >> 1);
x2 = s&m;
x = (x & 0x33333333) + (x2 & 0x33333333);
s = x >> 4;
m = ~((1 << 31) >> 3);
x3 = s&m;
x = (x & 0x0F0F0F0F) + (x3 & 0x0F0F0F0F);
s = x >> 8;
m = ~((1 << 31) >> 7);
x4 = s&m;
x = (x & 0x00FF00FF) + (x4 & 0x00FF00FF);
s = x >> 16;
m = ~((1 << 31) >> 15);
x5 = s&m;
x = (x & 0x0000FFFF) + (x5 & 0x0000FFFF);
return x;
关键在于理解如何实现“上一个问题中各个部分有几个1 = 当前问题中相邻两个部分1的个数相加”之中,相邻两部分相加。
不难想到,我们可以使用掩码。
例如:
01010101和10101010(相邻的两位相加,结果为四部分状况答案)
x = x&0b01010101 + x&0b10101010
00110011和11001100(相邻的四位相加,结果为两部分状况答案)
x = x&0b00110011 + x&0b11001100
00001111和11110000(相邻的四位相加,结果为“一”部分状况、最终答案)
x = x&0b00001111 + x&0b11110000
当然这只是对最开始用例的解释,对于具体的计算机当中的int类型,32位可以如此类比。
最终我们需要合并使用当前问题的答案求解上一个问题5次(32 = 2^5),对应代码中5处使用了掩码的位置。
值得一提的是,也可以在一次计算当中不更换掩码,但是要将x左或右移(逻辑右移!)对应的位数,就像我在代码中的那样。
具体要求:对于数值型数据x,若x == 0x00000000,则输出 0b00000000000000000000000000000001,否则输出0b00000000000000000000000000000000
注:上面的常数均为补码值,用于做相等的比较的时候也是用的x的补码值,而非真值。
思路:对于非0数,其相反数的符号位一定与原数的符号位不同。考虑原数与相反数相或后考虑符号位的情况,来判断x本身是否为0。
思路:
1、我们知道n位补码的表示范围是-2^n~2^n-1,因此我们需要判断x是否在这个范围之内。
2、在当前环境下,x是由32位二进制补码储存在计算机当中的,我们不难发现:如果x只需要n位补码,那么在计算机当中前面的32-n位补码是空闲的,所以我们可以将x在计算机当中的补码,先左移32-n位,再右移动还原,通过判断这样操作之后得到的补码与x的补码是否仍然相同,来判断x是否只需要n位补码
3、最后加上一点补充,来更好地这个问题:
上面的思路对于正数来说是可以直接使用的,并且也是好理解的(因为闲置位置上的补码都是0,包括符号位也是0)
但是对于负数而言,最高位是1(符号位),我们或许会下意识认为,对于实际上的计算机而言,(从右往左,以下都是)第32位是没有闲置的,对于只需要n位补码的负数x,在32位的环境下,实际上被闲置的是第31位到第n位,而非和正数一样的第32位到第n+1位。进一步,我们会下意识认为,闲置的位置都是0,那么第31位是0,一旦左移符号位1就会被弃置,而再左移回来时在大多数情况下,符号位都只会是1,而认为由于32位环境最高位表示负数符号位的特殊性,导致了对于负数这样的“左移右移”无法解决问题。
显然,这样的理解是错误的,举个简单的反例,-1在32位中的补码是111…11(32个1),并非我们理解的闲置位置是0,所以其实对于一般的负数,我们会发现当它只需要n位补码表示的时候,在32位的环境下,其闲置的位置都是1,这样就不会出现我们认为的错误的情况,所以这个方法对于负数也是适用的。
int l = 32 + ~n + 1;
return !(x ^ (x << l >> l));
思路:
1、首先我们要思考为什么有取整的问题,答案很简单,从一种简化的形式来说,答案可以用“1除以2除不尽(整数范围)”来概括,于是我们要考虑,该如何处理一下,让这个算式有一个结果。处理的方法就是向下取整(1/2 = 0)或者向上取整(1/2 = 1)
2、为了后面描述方便,我们在此前先看看向上、下取整,在1、在二进制下的形式。
不妨考虑(默认二进制,十进制末尾用D表示)奇数:XXXXX11(末位为1),除以2D,即右移1。XXXXX011/2D = (XXXXX010/2D)+1/2D,这就回到了1、,且更具有一般性。
如果要向下取整即1/2D = 1,在这个过程当中实际上等效于将1,当作10使用,即对XXXXX011进行了加1操作后进行XXXXX110>>1 = XXXXXX11,而不同于原来的XXXXX011>>1 = XXXXXX01
如果要向上取整,也就是直接抛弃最低位1,仍由右移时将它弃置。
3、所以1、中的情况在二进制下实际上就是考虑,要不要让末尾的1在一次右移当中被抛弃,如果是的话则对应向下取整,直接右移即可,如果不是的话则应该加1,让1->10,从而在除以2D时达到1D当作2D用的效果
4、所以一般地,对于除以2^n,即要右移动n次,是否要将前n位可能的1直接抛弃,就对应了是否要向下取整,所以我们直接对原数在前n位分别加上1,确保它们都有“1D当2D用的效果”即可达到向上取整的目的。
5、题目要求向0取整,对于正数而言向0取整就是向下取整,对于负数而言是向上取整。所以对正数直接右移n位,对负数在第n位后加1,再右移动n位。
思路:原数的负数对应的补码,等于原数的补码取反再加1。
思路:
1、考虑x的相反数,正数的相反数的补码符号位一定是1,负数及0的相反数的补码一定是0。
2、但是注意有一个特殊的负数存在,及-2^(n-1) - 1 = -2147483648(32位),这个负数是在32位补码对应的表示范围之内没有对应的相反数,按照常规的求相反数的补码(按位取反再加1)之后,得到的仍然是它本身,符号位不会改变。
3、所以在我们求完x的相反数y之后,只需要在最后查看y的符号(1则x为正,0则x为负或0)时:(y>>31)&1(用于查看符号),加上(y&(y^x)>>31)&1(似乎还有一点问题)即可。因为y^x,的相当于查看x与其相反数的符号位是否相同,如果相同y^x的符号位是0,否则是1,即对-2147483648进行了特判。
思路:
1、这道题要分三种情况考虑,我最开始想到的是情况1,直接判断x-y(即x + ~y + 1)的符号位是什么,如果是0,则x > y,如果是1,则x < y。
2、显然,上面的做法存在问题,很容易发现,无法处理x == y的情况,这种情况下,对应x-y的符号位是0,而不同于x < y时题目种要求的1。
所以我考虑了第二种情况,x == y时,只需要判断!(x^y)的状态,如果是0则,x、y不等,这时交给1、判断,如果是1则x、y相等,只需要将1、2、中两个式子用|连接,如果2、中得到1则会直接得出答案,如果2、中得出0,也不会影响1、中的判断结果(零一律)。
3、然而还有一种情况是我们没有考虑到的,那就是在x、y异号的时候,可能出现的overflow,比如-2147483648,让其减去任意的负数,在32位补码的情况下,它都会变成一个正数(符号位为0),而这种情况是只会在x、y异号的时候出现的(同号时,只要是减法,都只会向0靠近,而不会向边界靠近,出现overflow),所以我们只需要和2、中一样,在加上一种情况的式子,并用|与前两个式子连接即可。所加的式子,首先判断x、y是否异号,如果是的话,我们可以直接通过x的符号给出答案,因为负数一定小于正数,所以第三种情况对应的式子是:((x^y)>>31&1&(x>>31&1)),其中(x^y)>>31&1在第一位给出了x、y符号是否相异,如果是的话,为1,后者(x>>31&1)会在第一位给出x的符号;否则为0,整个式子为0,当前的大小情况交给1、2、来判断。
t 追踪执行命令
a 指定内存后(回车)写入指令
d 从哪段内存开始 显示多长的内存//显示内存中内容
e 从哪段内存开始(回车)修改内存
u 从哪段内存开始//显示翻译后内存中内容
mov ax,bx
add ax,bx
sub ax,bx
注意高八位、低八位,h、l
注意数据溢出,加法溢出则舍去,减法不足则借位,指定了高八位、低八位就以对应的两个数字为参考标准确定是否要舍去与借位,不能修改其它数字。
mul bx
相乘的数都是八位或者都是十六位
八位:一个默认放在AL中,另一个放在8位reg或内存中;结果默认放在AX中
十六位:一个默认放在AX中,另一个放在16位reg或内存中;结果默认低16位放在AX中,高16位放在DX中。
8位:ALBL = AX
16位:AXBX = DXAX
div bx
除数:8位、16位(2个数字、4个数字)两种
被除数:默认放在AX或DX和AX中,除数为8位则被除数为16位默认放在AX中;如果除数为16位,则被除数为32位,默认放在DX和AX中,DX存放高16位,AX存放低16位。
结果:如果除数为8位,则AL中存放结果,AH储存余数;如果除数为16位,则AX存储商,DX存储余数。
除数8位:AX/BL = AL … AH
除数16位:DXAX/BX = AX … DX
以二进制为标准
指定8位还是16位进行运算
shl ax,1
shl、shr 左移、右移,超出的舍去,缺少的0补
rol、ror 循环左移、右移,超出的补到后面缺少的
带进位的循环左移、右移 rcl rcr(了解)
以二进制为标准
inc ax
dec ax
相当于ax++、ax–
(进位、借位与普通加减法相同)
如果除法除以0会进入一个中断
使用int 0也可以进入这个中断
如果除以0是一个错误,会触发int 0的中断,会找到一个地址,代码运行的指针会指向这个地址,接下来或许可以通过在这个地址准备相应的处理方法来解决异常(了解)
我们需要知道的就是当代码发生错误,代码运行的指针会跳转到其它地址。
常见的中断编号int 0、int 9
物理地址 = 段地址*16+偏移地址
DS寄存器,数据段地址寄存器
r ds
可编辑DS当中的内容
配合mov指令使用,如
mov ax,[60]
效果会是将DS中的段地址结合[60]偏移地址指向的内容复制给ax
[]中对应的都是低位
但是注意:在内存当中字单元的概念,即将一个字型数据(16位)的内存单元,由两个地址连续的内存单元,高地址内存单元(非起始)存放字符型高位字节,低地址内存单元(起始)存放字符型低位字节。
如我们将DS设置为21F0后,使用mov指令会将21F0:0060中的内容复制给ax
而d 21F0:0060这样显示:
12 34
则0060为低位,0061为高位
所以对应AXL 和 AXH,由此得到ax为3412
但是以上内容在使用al、ah等直接对八位操作的时候,对应的物理地址上的八位数会直接被移动到对应位置,而不需要考虑是高地址还是低地址内存
另外
Read more -->注意:不能使用mov ds,10 00
但是可以
mov 1000,ax
mov ds,ax
《甲辰正月初一为灵泉诸香客赋》
水澹金粼雾舞空,烟锁灵山山囚龙。
霰尽芳菲行者至,露上凝珠紫气东。
父老提携童子笑,诸君揖互彩云从。
香火连天今日有,爆竹声毕夕已终。
~
《危勉》
黄烛灯火暗凝香,红袖酥肩幻梦长。
醉酒吟誐任疏狂,百落临渊战心惶。
前路无光路满霜,苦难同尘藏四方。
来年不求万事祥,我愿与之较锋芒。
~
《贻君》
春秋五载与君识,几经离别未有知。
可怜怎奈书生骨,举杯邀酒话无时。
今昔难见来日昶,参商共映明月光。
高山流水何其多,相见不言别离长。
《秋意尽》
秋霜一点红,寒露语松榕。
越鸟惊乡客,南巢临北冬。
遍揲晓风月,满羽繁星空。
择地息未有,淡裁碌日中。
何日花前酒,携诗青崖诵。
~
《不意雨》
云野伴骄阳,仲夏风曦长。
身待雨缦缦,旱久难滂滂。
卧阴苇下驻,遮乌泮水旁。
念死闲行日,不意甘霖降。
《月夜寄故人》
细柳抚荫晓云畔,青山带水过君岸。
虽守陌路长相隔,念此故人月上看。
~
《碧波行》
见海连天月下开,踏彩逐浪思楼台。
台下霓潮绕浪舞,台上金麟为我来。
~
《临钟书阁》
长天碧色里,高阁一湖中。
传即千古士,行则知无穷。
~
《嘲》
携卷履地因风进,卧看长空皓月行。
明眸晶莹玉齿杯,蓬头恹面笑长情。
《夏日乱笔》
墨上还新山水通,此间独骑临霜松。
昨年闻香落笔柔,意与锋芒寄青空。
海破日出乾坤动,河汉月邀金乌重。
沧浪折煞浮萍起,百波沉浮犬马恸。
他日锥断窠臼风,白鹤冲天烟柳中。
任子何笑鱼龙游,东风吹我麟阁梦。
~
《闻雨祭剑》
鸣剑八尺,柄灼伤伤。
血蚀锈迹,斑斑其煌。
剑折剑伤,不改剑刚。
素钢以铸,可刻金光。
百剑之中,其伤为扬。
剑鸣剑光,旦列剑榜。
~
《田间乱笔》
百日随春尽,新曦按夜来。
碧草凝寒露,陌上芳菲开。
折枝近门扉,黄䤋扶老待。
相论无功名,赤子初心在。
~
《告己书》
自负有翅,既委金笼。
不绝长空,何异斑鸠!
虽离群所,日起当思。
衣冠正否,行止绳否。
若背师恩,女颜不存。
若耽暖衾,女辞为空。
而至今日,才非盖世。
略有所长,只在微志。
今志但弃,形飞神灭。
渺渺于世,不知为人。
幸生父母,又遇恩师。
教吾配兰,视吾圣贤。
前见子丘,后瞻东坡。
周环吾身,竖子小儿。
其钻弥坚?其爱一欢?
若以为前,即当顺羽。
若就后居,不如便埋!
~
百年征程易难兴,只言片语寥可尽?
听罢放翁示儿语,途闻鹏举复国心。
鱼耽海者树鸟亲,风化雨兮草木喑。
今时往已难可忆,唯叹受多报无冯!
~
《白天野》
蹇驴踏寒山,欲寻春可安。
此去十二载,未觉铁岭难。
路别桃花庵,又至神女山。
朱唇抿贝齿,纵邀即日欢。
谢蛾眉观,仰首望河汉。
心驶沧浪处,欲起罢钓竿!
《夏》
微月照鬓角,夏风拂过柳眉梢。
微踮首,咧嘴笑,花色泛上白裙脚。
又是一年蝉鸣时,荏苒莺飞鸟。
犹觉夏日胜好。
~
Read more -->《览逍遥游有感》
余见千里之修厚鲲鹏者,以六月之息,适于南冥,一跃而上九万里,水击三千里。
余览其逍遥也,见其适者,天时也,非无所依也。然余谓之,己之限及身之短者,了然于胸,明所适者而享逍遥之微寥,不亦 逍遥也?
余见蜩与学鸠,以决起而飞,抢树而至,下鲲鹏之所适者,成其逍遥之逍遥也,特不解鲲鹏之所适者也。
余谓之,虽是井底之蛙,然于其身者,乐也,见世间万般皆下品,为己独高。于己之界,所达皆可有,所求皆以应,不亦逍遥 也?
且夫不死之椿,长生之冥灵,而宋荣子之辈不亦似鲲鹏哉,或有上中下之境焉也。
至于至人,神人,圣人,于天地之间无所适,乘万物之正,驾六气之辩者,余谓之人力所莫能及。然拊度其中,乘万物之正者 ,即庄周所言,物我为一,以天地万物之百变为己之息,如己心之动,血之流者。所适者皆如己出,故无所适也,通透哉!而 御六气之变,且夫游于无穷之中,仙人之谓也,非物力所能及。
故吾小儿,斗胆列逍遥之次,小,中,大者也。
小之逍遥,所限莫所大焉,然其不见,独达于己,鄙薄万物而如稚童,亦有乐者也。
中之逍遥,所限或有见微,然其了然,善适万物,夷其所长善之所短,诚然逍遥也。
大之逍遥,所限者于己身,通透明达,处之世间,无所不乐无所不适,此真逍遥也。
然三者之上,所能有游于无穷者,特为仙人之所处耳,言之何用?
小之逍遥,行年必出,中之逍遥,或死无穷。
故吾见中之逍遥亦有三般。
一曰,蟪蛄已死,化茧成蝶,初出井底,蓦然之余,惶惶之间,不知所为,旦怀为先,嘲之小儿以自饰,宋荣子之辈也。
二曰,明于世间,知所何为,明所不为,朝朝暮暮,施力其中,然有所乐,亦有所乏,或感万物之何为,或冥灵大椿也。
三曰,旷达自若,气定神闲,可借薄力,而撼世间,明哲处事,善以待人,乐而长命,无所喟叹无所疲,或鲲鹏之状也。
然一者之上,二者之下,或鄙之所谓也,目力有限,思有所疲,略省二者寥寥,而思三者谓何,至于大逍遥者,或愚竭毕生之 力而无以及,乃今之人或有一二,故余妄言,见之可由。余之所望,尽己之力,达于三者而望大逍遥者,仙人之风,果然之间 ,或付诸笑谈一二。