精华内容
下载资源
问答
  • Abstract:此篇文章讲述的是计算机存储器、控制器、运算器的基本结构组成以及指令的具体执行顺序。  CPU包括运算器和控制器, 而主机主要包括CPU和存储器。 内容参考于:哈工大计算机组成原理(刘宏伟) ...

    Abstract:此篇文章讲述的是计算机存储器、控制器、运算器的基本结构组成以及指令的具体执行顺序。  CPU包括运算器和控制器, 而主机主要包括CPU和存储器。

    内容参考于:哈工大计算机组成原理(刘宏伟)


    存储器的基本组成:

    如下图所示: 主存由存储体、MAR和MDR组成。

    先来看几个概念

    存储单元:存储数据的具体单位是存储单元,字节是目前计算机最基本的存储单位。 来自于什么是计算机的存储单元, 存储体由许多存储单元组成。每一个存储单元赋一个地址。可以按地址寻访。

    存储字:存储单元中二进制代码组合。

    存储字长:存储单元中二进制代码的位数。

    MAR:存储器地址寄存器 - 保存存储单元地址。  MAR的位数与存储单元的个数相关。

    MDR:存储器数据寄存器 - 反映存储字长。里面存储的数据来自三方面: 1、准备送往CPU的数据。 2、准备存入存储器的数据。 3、刚才存储体中取出来的数据。

    例如:MAR = 4, MDR = 8. 说明存储单元个数为16个, 存储字长为 8.

    运算器

    由上图很容易可以看出运算器的组成结构是:ALU(算数逻辑单元运算器)和三个寄存器。

    其中ALU是一个组合电路, 特点是当输入数据撤销时, 输出也会跟着撤销;所以要在前面加相应的寄存器(ACC和X(数据寄存器))用来存储输入数据,即参与运算的值。

    同时ACC也用于保存运算结果。 但是由于乘法操作的输出字长为输入字长的两倍;所以需要增加一个MQ寄存器来存放多余的数据。


    下图是进行四则运算时各个寄存器的值

    下面是具体实现过程:

    1, 加法操作过程:

    此时的指令为:, 操作码是:加; 地址码是M。

    首先在内存中取被加数于ACC中, 然后是执行加法指令。 从存储器之中取地址为M的数放在寄存器X中, 然后在ALU的操作下将ACC和X寄存器里面的值相加并将

    结果放在ACC里面。

    2, 减法操作过程:

    此时指令为:

    这个过程和加法差不多, 就不啰嗦了。

    3, 乘法操作过程:

    此时指令为:

    首先在内存中取被乘数的值放入寄存器ACC中, 然后在内存中取 M地址对应的值放在X中, 然后将ACC寄存器里面的值放在寄存器X里面; 再将0放入ACC中(清

    零)。 最后将寄存器 X 和 MQ 寄存器里面的值相乘结果的高位放在 ACC 中, 低位放在 MQ 中。这里要注意一点:计算机里面的乘法是通过累加和移位来实现的;

    并不能直接实相乘。

    4, 除法操作过程:

    此时指令为:

    首先在内存中取被乘数的值放入寄存器ACC中, 然后取地址为 M 的值放在 X 寄存器之中。 然后将 ACC 寄存器和 X 寄存器里面的值相除放在 MQ 寄存器之中。

    注意:以上操作都是在控制器的控制下进行的。

    控制器的基本结构:

    控制器的功能是:解释执行; 保证指令有序执行。

    完成一条指令一般包含三部分: 取指令; 分析指令; 执行指令。

    取指令需要PC寄存器, PC寄存器的作用是存放当前欲执行指令的地址; 并且具有计数功能:PC + 1 = PC。 其中 1 是由具体机器决定的。 一般指令都是放一块的。

    分析指令:将操作码给需要控制单元。

    执行指令:由控制单元控制执行这条指令所需要的单元; 主要是CU控制。


    下面具体说明一条指令的执行过程:取数指令为例


    取值:首先指令地址是在PC中, 然后送入MAR中, 在控制器的作用下将MAR中指令地址下的那条指令取出来放在MDR中。 接着再送到IR中(IR的作用就是存储当前指令)

    分析指令:将指令的操作码部分送给CU(上图中序号为5的箭头方向反了), 经过译码之后, 在CU上面会有很多信号, 然后由这些信号控制执行这个操作所需要的部件。

    执行指令:因为是取数指令, 执行时就是在内存中取一个数到ACC中。 在控制器的控制下, 将取数指令的地址码送到MAR中, 然后从内存中取出该地址下的数据到MDR,

    最后送到ACC中。 到此这条指令结束。

    ~ END ~

    展开全文
  • 最近面试的时候被问到指令集,一头雾水,由于之前的工作没有涉及到指令方面的知识,现总结成文。 定义 指令集架构(英语:Instruction Set Architecture,...指令集架构包含一系列的opcode即操作码(机器语言)...

    最近面试的时候被问到指令集,一头雾水,由于之前的工作没有涉及到指令集方面的知识,现总结成文。

    定义

    指令集架构(英语:Instruction Set Architecture,缩写为ISA),又称指令集或指令集体系,是计算机体系结构中与程序设计有关的部分,包含了基本数据类型指令集寄存器寻址模式存储体系中断异常处理以及外部I/O。指令集架构包含一系列的opcode即操作码(机器语言),以及由特定处理器执行的基本命令。(wiki定义

    关于指令集的工作方式,知乎上有一个回答我觉得还可以,这里引用一下:
    CPU的指令集存放在哪里?
    其内容如下:

    比如我们设计一套指令集,其中肯定有条加法指令。比如Add R1 R2 。我们可以认为这条指令的意思是计算寄存器R1中的内容和R2的和,然后把结果存到R1寄存器中。
    那么经过编译后这条指令会变成二进制,比如010100010010 。这条二进制指令一共12位。明显可以分为三大部分。最前面的0101表示这是条加法指令,后面0001说的是第一个操作数是寄存器1,最后0010说的是第二个数就是寄存器2(其实实际没有这么简单的指令,至少应该区分操作数是寄存器还是直接的数据,但为了把这说的更容易理解作了简化)。我们可以通过十二根导线把这条指令输入一个CPU中。导线通电就是1,不通电就是0 。为了叙述方便我们从左到右用A0-A11给这12根导线编上号。
    然后计算机会分析这条指令。步骤如下:
    最开始的两根导线A0和A1,第一根有电第二根没电,就能知道这是一条运算指令(而非存储器操作或者跳转等指令)。那么指令将被送入逻辑运算单元(ALU)去进行计算。其实很简单。只要这两根线控制接下来那部分电路开关即可。
    接下来的A2和A3,01表示加法,那么就走加法运算那部分电路,关闭减法等运算电路。
    A4-A7将被送入寄存器电路,从中读取寄存器保存的值。送到ALU的第一个数据接口电路上。
    后面的A8-A11同样被送入寄存器选择电路,接通R2寄存器,然后R2就把值送出来,放到ALU的第二个数据接口上。
    ALU开始运算,把两个接口电路上的数据加起来,然后输出。
    最后结果又被送回R1。
    基本上简单的运算计算机就是这么操作的。他其实不知道你那些指令都是什么意思。具体的指令编程机器码后就会变成数字电路的开关信号。其中某几段会作为控制信号,控制其他部分的数据走不同的电路以执行运算。他没有一个地方保存着如何翻译这些机器码的字典,所有机器码的意义都被体现在整个电路的设计中了。
    当然,从汇编到机器码这步是汇编程序翻译的。汇编程序当然知道某条指令要翻译成什么样的机器码。

    所以指令集的目的就是为了实现底层操作,为每一种运算,每一种操作(如数据移动)提供相应的寄存器级别的动作,这些寄存器再和最底层的逻辑电路对应,最终完成顶层类似于"int a = 0; a = 1 + 2"的功能。

    Reference:
    [1] Wiki:指令集架构
    [2] 知乎——CPU的指令集放在哪里?

    展开全文
  • AT指令方面的研究

    千次阅读 2011-04-05 09:13:00
    最近笔者有个项目需要做自动发短信的模块,不过本来想简单行事,让客户购买移动的服务,即调用移动的Web Service来实现,结果客户考虑到...采用硬件来实现自动发短信的功能就涉及到AT指令这个东西。 、AT

    最近笔者有个项目需要做自动发短信的模块,不过本来想简单行事,让客户购买移动的服务,即调用移动的Web Service来实现,结果客户考虑到移动的服务资费太高,所以没办法只好改用短信猫的方式了。采用硬件来实现自动发短信的功能就涉及到AT指令这个东西。

    一、AT指令的概述

    AT AttentionAT指令集是从终端设备(Terminal EquipmentTE)或数据终端设备(Data Terminal EquipmentDTE)向终端适配器(Terminal Adapter TA)或数据电路终端设备(Data Circuit Terminal EquipmentDCE)发送的。通过TATE发送AT指令来控制移动台(Mobile StationMS)的功能,与GSM 网络业务进行交互。用户可以通过AT指令进行呼叫、短信、电话本、数据业务、传真等方面的控制。90年代初,AT指令仅被用于Modem操作。没有控制移动电话文本消息的先例,只开发了一种叫SMS BlockMode的协议,通过终端设备(TE)或电脑来完全控制

      SMS。几年后,主要的移动电话生产厂商诺基亚、爱立信、摩托罗拉和HP共同为GSM研制了一整套AT指令,其中就包括对SMS的控制。AT指令在此基础上演化并被加入GSM0705标准以及现在的GSM0707标准,完全标准化和比较健全的标准。如:对SMS的控制共有3种实现途径:最初的BlockMode;基于AT指令的TextMode;基于AT指令的PDUMode。到现在PDUMode已经取代BlockMode,后者逐渐淡出。GSM模块与计算机之间的通信协议是一些AT指令集,AT指令是以AT作首,字符结束的字符串,AT指令的响应数据包在中。每个指令执行成功与否都有相应的返回。其他的一些非预期的信息(如有人拨号进来、线路无信号等),模块将有对应的一些信息提示,接收端可做相应的处理。

    二、常见的AT指令

    呼叫控制命令

      1 ATD 拨号命令。这个命令用来设置通话、数据或传真呼叫。

      2 ATH 挂机命令。

      3 ATA 接电话。

      4 AT+CEER 扩展错误报告。这个命令给出当上一次通话设置失败后中断通话的原

      因。

      5 AT+VTD 给用户提供应用GSM网络发送DTMF(双音多频)双音频。这个命令用来

      定义双音频的长度(默认值是300毫秒)。

      6 AT+VTS 给用户提供应用GSM网络发送DTMF双音频。这个命令允许传送双音频。

      7 ATDL 重拨上次电话号码。

      8 AT%Dn 数据终端就绪(DTR)时自动拨号。

      9 ATS0 自动应答。

      10 AT+CICB 来电信差。

      11 AT+CSNS 单一编号方案。

      12 AT+VGRAT+VGT 增益控制。这个命令应用于调节喇叭的接收增益和麦克风的传

      输增益。

      13 AT+CMUT 麦克风静音控制。

      14 AT+SPEAKER 喇叭/麦克风选择。这个特殊命令用来选择喇叭和麦克风。

      15 AT+ECHO 回音取消。

      16 AT+SIDET 侧音修正。

      17 AT+VIP 初始化声音参数。

      18 AT+DUI 用附加的用户信息拨号。

      19 AT+HUI 用附加的用户信息挂机。

    20 AT+RUI 接收附加用户信息。

     

    网络服务命令

      1 AT+CSQ 信号质量。

      2 AT+COPS 服务商选择。

      3 AT+CREG 网络注册。获得手机的注册状态。

      4 AT+WOPN 读取操作员名字。

    5 AT+CPOL 优先操作员列表。

     

     安全命令

      1 AT+CPIN 输入PIN

      2 AT+CPIN2 输入PIN2

      3 AT+CPINC PIN的剩余的尝试号码。

      4 AT+CLCK 设备锁。

    5 AT+CPWD 改变密码。

     

    电话簿命令

      1 AT+CPBS 选择电话簿记忆存储。

      2 AT+CPBR 读取电话簿表目。

      3 AT+CPBF 查找电话簿表目。

      4 AT+CPBW 写电话簿表目。

      5 AT+CPBP 电话簿电话查询。

      6 AT+CPBN 电话簿移动动作。这个特殊命令使电话簿中的条目前移或后移(按字

      母顺序)

      7 AT+CNUM 签署者号码。

      8 AT+WAIP 防止在下一次重起时初始化所有的电话簿。

      9 AT+WDCP 删除呼叫电话号码。

      10 AT+CSVM 设置语音邮件号码。

    短消息命令

      1 AT+CSMS 选择消息服务。支持的服务有GSM-MOSMS-MTSMS-CB

      2 AT+CNMA 新信息确认应答。

      3 AT+CPMS 优先信息存储。这个命令定义用来读写信息的存储区域。

      4 AT+CMGF 优先信息格式。执行格式有TEXT方式和PDU方式。

      5 AT+CSAS 保存设置。保存+CSAS+CSMP的参数。

      6 AT+CRES 恢复设置。

      7 AT+CSDH 显示文本方式的参数。

      8 AT+CNMI 新信息指示。这个命令选择如何从网络上接收短信息。

      9 AT+CMGR 读短信。信息从+CPMS命令设定的存储器读取。

      10 AT+CMGL 列出存储的信息。

      11 AT+CMGS 发送信息。

      12 AT+CMGW 写短信息并存储。

      13 AT+CMSS 从存储器中发送信息。

      14 AT+CSMP 设置文本模式的参数。

      15 AT+CMGD 删除短信息。删除一个或多个短信息。

      16 AT+CSCA 短信服务中心地址。

      17 AT+CSCB 选择单元广播信息类型。

      18 AT+WCBM 单元广播信息标识。

      19 AT+WMSC 信息状态(是否读过、是否发送等等)修正。

      20 AT+WMGO 信息覆盖写入。

      21 AT+WUSS 不改变SMS状态。在执行+CMGR+CMGL后仍保持UNREAD

    追加服务命令

      1 AT+CCFC 呼叫继续。

      2 AT+CLCK 呼叫禁止。

      3 AT+CPWD 改变追加服务密码。

      4 AT+CCWA 呼叫等待。

      5 AT+CLIR 呼叫线确认限制。

      6 AT+CLIP 呼叫线确认陈述。

      7 AT+COLP 联络线确认陈述。

      8 AT+CAOC 费用报告。

      9 AT+CACM 累计呼叫计量。

      10 AT+CAMM 累计呼叫计量最大值。

      11 AT+CPUC 单价和货币表。

      12 AT+CHLD 呼叫相关的追加服务。

      13 AT+CLCC 列出当前的呼叫。

      14 AT+CSSN 追加服务通知。

      15 AT+CUSD 无组织的追加服务数据。

    16 AT+CCUG 关闭的用户组。

     

    数据命令

      1 AT+CBST 信差类型选择。

      2 AT+FCLASS 选择模式。这个命令把模块设置成数据或传真操作的特殊模式。

      3 AT+CR 服务报告控制。这个命令允许更为详细的服务报告。

      4 AT+CRC 划分的结果代码。这个命令在呼叫到来时允许更为详细的铃声指示。

      5 AT+ILRR 本地DTE-DCE速率报告。

      6 AT+CRLP 无线电通信线路协议参数。

      7 AT+DOPT 其他无线电通信线路参数。

      8 AT%C 数据压缩选择。

      9 AT+DS 是否允许V42二度数据压缩。

      10 AT+DR 是否报告V42二度数据压缩。

    11 AT/N 数据纠错选择。

     

    传真命令

      1 AT+FTM 传送速率。

      2 AT+FRM 接收速率

      3 AT+FTH HDLC协议设置传真传送速率。

      4 AT+FRH HDLC协议设置传真接收速率。

      5 AT+FTS 停止特定时期的传送并等待。

    6 AT+FRS 接收沉默。

     

    第二类传真命令

      1 AT+FDT 传送数据。

      2 AT+FDR 接收数据。

      3 AT+FET 传送页标点。

      4 AT+FPTS 页转换状态参数。

      5 AT+FK 终止会议。

      6 AT+FBOR 页转换字节顺序。

      7 AT+FBUF 缓冲大小报告。

      8 AT+FCQ 控制拷贝质量检验。

      9 AT+FCR 控制接收传真的能力。

      10 AT+FDIS 当前会议参数。

      11 AT+FDCC 设置DCE功能参数。

      12 AT+FLID 定义本地ID串。

    13 AT+FPHCTO 页转换超时参数。

     

    V24-V25命令

      1 AT+IPR 确定DTE速率。

      2 AT+ICF 确定DTE-DCE特征结构。

      3 AT+IFC 控制DTE-DCE本地流量。

      4 AT&C 设置DCD(数据携带检测)信号。

      5 AT&D 设置DTR(数据终端就绪)信号。

      6 AT&S 设置DST(数据设置就绪)信号。

      7 ATO 回到联机模式。

      8 ATQ 决定手机是否发送结果代码。

      9 ATV 决定DCE响应格式。

      10 ATZ 恢复为缺省设置。

      11 AT&W 保存设置。

      12 AT&T 自动测试。

      13 ATE 决定是否回显字符。

      14 AT&F 回到出厂时的设定。

      15 AT&V 显示模块设置情况。

      16 ATI 要求确认信息。这命令使GSM模块传送一行或多行特定的信息文字。

    17 AT+WMUX 数据/命令多路复用。

     

    特殊AT命令

      1 AT+CCED 电池环境描述。

      2 AT+CCED 自动RxLev指示。

      3 AT+WIND 一般指示。

      4 AT+ALEA MEMSC之间的数据密码模式。

      5 AT+CRYPT 数据密码模式。

      6 AT+EXPKEY 键管理。

      7 AT+CPLMN PLMN上的信息。

      8 AT+ADC 模拟数字转换度量。

      9 AT+CMER 移动设备事件报告。这个命令决定是否允许在键按下时是否主动发送

      结果代码。

      10 AT+WLPR 读取语言偏好。

      11 AT+WLPW 写语言偏好。

      12 AT+WIOR 读取GPIO值。

      13 AT+WIOW GPIO值。

      14 AT+WIOM 输入/输出管理。

      15 AT+WAC 忽略命令。这个特殊命令允许忽略SMSSS和可用的PLMN

      16 AT+WTONE 播放旋律。

      17 AT+WDTMF 播放DTMF旋律。

      18 AT+WDWL 下载模式。

      19 AT+WVR 配置信差的声音速率。

      20 AT+WDR 配置数据速率。

      21 AT+WHWV 显示硬件的版本。

      22 AT+WDOP 显示产品的出厂日期。

      23 AT+WSVG 声音增益选择。

      24 AT+WSTR 返回指定状态的状态。

      25 AT+WSCAN 扫描。

      26 AT+WRIM 设置或返回铃声指示模式。

      27 AT+W32K 是否允许32kHz掉电方式。

      28 AT+WCDM 改变缺省旋律。

      29 AT+WSSW 显示内部软件版本。

      30 AT+WCCS 编辑或显示订制性质设置表。

      31 AT+WLCK 允许在特定的操作符上个性化ME

      32 AT+CPHS 设置CPHS命令。

      33 AT+WBCM 电池充电管理。

      34 AT+WFM 特性管理。是否允许模块的某些特性,如带宽模式、SIM卡电压等。

      35 AT+WCFM 商业特性管理。是否允许Wavecom特殊特性。

      36 AT+WMIR 允许从当前存储的参数值创建定制的存储镜像。

      37 AT+WCDP 改变旋律的缺省播放器。

    38 AT+WMBN 设置SIM卡中的不同邮箱号码。

     

    SIM卡工具箱命令

      1 AT+STSF 配置工具箱实用程序。

      2 AT+STIN 工具箱指示。

      3 AT+STGI 获得从SIM卡发来的预期命令的信息。

      4 AT+STCR 主动提供的结果:工具箱控制反应。

      5 AT+STGR 给出响应。允许程序或用户从主菜单上选择项目,或响应某些命令。

    三、发短信模块的AT指令

     发短信相关的指令到前面的常用指令中找找,在这阐述一下发短信的原理:我们是采用COM端口发送短信的,所以一开始就需要初始化一个串口COM,接着在这个窗口中设置短信中心号(如果是硬件中已经设置了短信中心号,就可以不用设置),设置短信的模式(TEXT、PDU,如果硬件为手机的话,经测试不需要该设置),接下来就是发送编码号的短信内容。

     

    1.初始化串口:
       SerialPort sp = new SerialPort("COM19", 9600, Parity.None, 8, StopBits.One);
       sp.Open();
       sp.Handshake = Handshake.None;
       sp.Encoding = Encoding.ASCII;
       sp.DtrEnable = true;
       sp.RtsEnable = true;
    2.发送TEXT短信,不支持中文

    //设置命令模式,1表示TEXT模式
    AT+CMGF=1

    编码编码方式采用ASCII
    3.发送PDU短信,支持中文
    接收手机号:136354393xx (注意换成实际手机号)
    短信内容:江津是个好地方
    PDU
    内容为:11000D916831364593x3Fx0008000E6C5F6D25662F4E2A597D573065B9
    1100:固定值
    0D:接收手机号长度
    91
    :表示接收方为手机
    6831364593x3Fx:接收手机号的反8
    000800:固定值
    0E :短信内容的十六进制编码长度/2,保留2位十六进制数。
    6C5F6D25662F4E2A597D573065B9:短信内容江津是个好地方unicode十六进制编码。
    4.通过PDU,发送WAP PUSH短信
    发送内容:0051000BA131364593x3Fx00F5A7460B05040B8423F0000303010129060603AE81EA8DCA02056A0045C6080C037761702E62616964752E636F6D000103E6B19FE6B4A5E698AFE4B8AAE5A5BDE59CB0E696B9000101
    /**
                      *00           SMSC 地址信息的长度 00表示用手机上设置短信中心号码,PDU 串的“SMSC 址格式段和“SMSC 地址段将省去
                      *51           基本参数(TP-MTI/VFP) 不要求发送回复
                      *00           消息基准值(TP-MR)
                      *0B           对方电话的长度
                      *A1           目标地址格式 A1表示为国内格式
                      *31364593x3Fx 目标地址,补‘F’凑成偶数位后奇偶位互换(注意改成实际号码)
                      *00           协议标识(TP-PID) 是普通GSM 类型,点到点方式
                      *F5           用户信息编码方式 (TP-DCS)
                      *A7           有效期(TP-VP)
                      *85           用户信息长度(TP-UDL) (此处是从下面的0B开始所有的字节数/2对应的十六进制数)
                      *0B           WAP PUSH头部的总长度
                      *05040B8423F0
    表示接下来是一个WAP PUSH
                      *00           表示是Concatenated Short Messages
                      *03           长度
                      *03           reference number
                      *01           表示分成1个短信发送
                      *01           当前包的序号
                      *29060603AE81EA8DCA WSP
                      *02          
    标记位
                      *05           -//WAPFORUM//DTD SI 1.0//EN
                      *6A           UTF-8
                      *00          
    标记开始
                      *45
                      *C6           < />
                      *08
                      *0C           href="http://
                      *03          
    字符串开始
                      *7761702e62616964752e636f6d URL: wap.baidu.com
                      *00           URL
    字符串结束
                      *01           >
                      *03          
    内容描述字符串开始
                      *e6b19fe6b4a5e698afe4b8aae5a5bde59cb0e696b9  
    内容:江津是个好地方
                      *00          
    内容描述字符串结束
                      *01           /P>
                      *01           /P>
                      */

    PDU数据格式分析

    本部分的PDU数据格式分析属于通用性质的,在具体的硬件上还稍有不同,本人也是根据本数据格式分析后,重写出自己的PDU数据编码模块的。不过本人是在手机上测试的,稍有不同的地方是:下面提到的11 00 0D 中的0D改成了0B,以及后面的目的地(手机号)也没有加所为的91(+)86部分。通过上述部分的调整本人能够通过电脑操作手机发送短信了。

      例如,我们要将字符“Hi”字符发送到目的地“13678099”

      PDU字符串为:

      08 91 683108701305F0 11 00 0D 91 3176378290F9 00 00 00 02 C834

      ⑴08—短信息中心地址长度。指(91)+(683108701305F0)的长度。

      ⑵91—短信息中心号码类型。91是TON/NPI遵守International/E.164标准,指在号码前需加‘+’号;此外还有其它数值,但91最常用。

      91—10010001

      BIT No.

      7

      6

      5

      4

      3

      2

      1

      0

      Name

      1

      数值类型

      号码鉴别

      数值类型(Type of Number):000—未知,001—国际,010—国内,111—留作扩展;

      号码鉴别(Numbering plan identification):0000—未知,0001—ISDN/电话号码(E.164/E.163),1111—留作扩展;

      ⑶683108701305F0—短信息中心号码。由于位置上略有处理,实际号码应为:8613800 731500(字母F是指长度减1)。这需要根据不同的地域作相应的修改。

      ⑴、⑵、⑶通称短消息中心地址(Address of the SMSC)。

      ⑷11—文件头字节。

      11&h=00010001&b

      BIT No.

      7

      6

      5

      4

      3

      2

      1

      0

      Name

      TP-RP

      TP-UDHI

      TP-SPR

      TP-VFP

      TP-RD

      TP-MTI

      value

      0

      0

      0

      1

      0

      0

      0

      1

      应答路径—TP-RP(TP-Reply-Path):0—不设置; 1—设置

      用户数据头标识—TP-UDHL(TP-User-Data-Header-Indicator):0—不含任何头信息; 1—含头信息

      状态报告要求—TP-SPR(TP-Status-Report-Request):0—需要报告; 1—不需要报告

      有效期格式—TP-VPF(TP-Validity-Period-Format):00—不提供(Not present); 10—整型(标准);01—预留; 11—提供8位字节的一半(Semi-Octet Represented)

      拒绝复制—TP-RD(TP-Reject-Duplicates):0—接受复制; 1—拒绝复制

      信息类型提示—TP-MTI(TP-Message-Type-Indicator):00—读出(Deliver); 01—提交(Submit)

      ⑸00—信息类型(TP-Message-Reference)

      ⑹0B—被叫号码长度。

      ⑺91—被叫号码类型(同⑵)。

      ⑻3176378290F9—被叫号码,经过了位移处理,实际号码为“1368099”。

      ⑹、⑺、⑻通称目的地址(TP-Destination-Address)。

      ⑼00—协议标识TP-PID(TP-Protocol-Identifier)

      BIT No.

      7

      6

      5

      4

      3

      2

      1

      0

      Bit No.7与Bit No.6: 00—如下面定义的分配Bit No.0—Bit No.5;01—参见GSM03.40协议标识完全定义;10—预留;11—为服务中心(SC)特殊用途分配Bit No.0—Bit No.5。

      一般将这两位置为00。

      Bit No.5:0—不使用远程网络,只是短消息设备之间的协议;1—使用远程网络。

      Bit No.0—Bits No.4:00000—隐含;00001—电传;00010—group 3 telefax;00100—语音;00101—欧洲无线信息系统(ERMES);00110—国内系统;10001—任何基于X.400的公用信息处理 系统;10010—Email。

      ⑽00—数据编码方案TP-DCS(TP-Data-Coding-Scheme)

      BIT No.

      7

      6

      5

      4

      3

      2

      1

      0

      Bit No.7与Bit No.6 :一般设置为00;Bit No.5:0—文本未压缩,1—文本用GSM标准压缩算法压缩;Bit No.4:0—表示Bit No.1、Bit No.0为保留位,不含信息类型信息,1—表示Bit No.1、Bit No.0含有信息类型信息;Bit No.3与Bit No.2:00—默认的字母表,01—8bit,10—USC2(16bit),11—预留;Bit No.1与Bit No.0:00—Class 0,01—Class 1,10—Class 2(SIM卡特定信息),11—Class 3。

      ⑾00—有效期TP-VP(TP-Valid-Period)

      VP value(&h)

      相应的有效期

      00 to 8F

      (VP+1)*5 分钟

      90 to A7

      12小时+(VP-143)*30分钟

      A8 to C4

      (VP-166)*1天

      C5 to FF

      (VP-192)*1 周

      ⑿02—用户数据长度TP-UDL(TP-User-Data-Length)

      ⒀C834—用户数据TP-UD(TP-User-Data)“Hi”

    开发心得:

    在开发类似于AT指令方面的项目时,特别需要编码成16进制或8进制或者2进制的信号时,最好找一个监视软件,看看发送的数据到底符不符合要求。在开发该模块时采用了Device Monitoring Studio监视软件。

    展开全文
  • 字节码指令详解

    万次阅读 2020-08-05 16:49:04
    通常一条CPU指令包括两方面的内容:操作码和操作数,操作码表示要完成的操作,操作数表示参与运算的数据及其所在的单元地址(这个单元地址可以是寄存器、内存等)。 Java虚拟机中的字节码指令与CPU中指令类似,Java...

    字节码指令详解

    指令简介

    在计算机中,CPU指令就是指挥机器工作的指令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是执行指令的过程,也就是计算机的工作过程。

    通常一条CPU指令包括两方面的内容:操作码和操作数,操作码表示要完成的操作,操作数表示参与运算的数据及其所在的单元地址(这个单元地址可以是寄存器、内存等)。

    Java虚拟机中的字节码指令与CPU中指令类似,Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(operand)所构成。

    操作数的数量以及长度取决于操作码,如果一个操作数的长度超过了一个字节,那么它将大端排序存储,即高位在前的字节序。

    操作码只占一个字节,也就导致操作码个数不能超过256。

    class文件只会出现数字形式的操作码,但是为了便于人识别,操作码有他对应的助记符形式。

    对于基本数据类型,指令在设计的时候都用一个字母缩写来指代(boolean除外)。

    基本数据类型 缩写
    byte b
    short s
    int i
    long l
    float f
    double d
    char c
    refrence a
    boolean

    指令详解

    加载存储指令

    加载存储指令用来交换局部变量表和操作数栈中的数据,以及将常量加载到操作数栈。

    1. 将一个局部变量从局部变量表中加载到操作数栈栈顶:
    iload、iload_<n>、lload、lload_<n>、fload、fload_<n>、dload、dload_<n>、aload、aload_<n>
    

    其中n为局部变量表中的slot的序号,double和long占用两个slot。

    1. 将一个操作数栈的栈顶元素存储到局部变量表:
    istore、istore_<n>、lstore、lstore_<n>、fstore、fstore_<n>、dstore、dstore_<n>、astore、astore_<n>
    
    1. 将一个常量加载到操作数栈栈顶:
    bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_m1、iconst_<i>、lconst_<l>、fconst_<f>、dconst_<d>
    

    操作数为将要操作的数值或者常量池行号。

    1. 扩充局部变量表的访问索引的指令:wide。

    运算指令

    运算指令会取出操作数栈栈顶的两个元素进行某种特定的运算,然后将结果重新存入到操作数栈栈顶。

    运算指令分为两种:整型运算的指令和浮点型运算的指令。

    无论是哪种运算指令,都使用Java虚拟机的数据类型,由于没有直接支持byte、short、char和boolean类型的算术指令,使用操作int类型的指令代替。

    加法指令:iadd、ladd、fadd、dadd

    减法指令:isub、lsub、fsub、dsub

    乘法指令:imul、lmul、fmul、dmul

    除法指令:idiv、ldiv、fdiv、ddiv

    求余指令:irem、lrem、frem、drem

    取反指令:ineg、lneg、fneg、dneg

    位移指令:ishl、ishr、iushr、lshl、lshr、lushr

    按位或指令:ior、lor

    按位与指令:iand、land

    按位异或指令:ixor、lxor

    局部变量自增指令:iinc

    比较指令:dcmpg、dcmpl、fcmpg、fcmpl、lcmp

    类型转换指令

    类型转换指令可以将两种不同的数值类型进行相互转换。这些转换操作一般用于实现用户代码中的显式类型转换操作,或者用来解决字节码指令集不完备的问题。

    宽化指令:

    • int类型到long、float或者double类型
    • long类型到float、double类型
    • float类型到double类型

    处理窄化类型转换(Narrowing Numeric Conversions)时,必须显式地使用转换指令来完成,这些转换指令包括:i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l和d2f。

    对象的创建与存取指令

    new:创建对象。

    getfield:获取实例对象的属性的值。

    putfield:设置实例对象的属性的值。

    getstatic:获取类的静态属性的值。

    putstatic:设置类的静态属性的值。

    数组的创建与存取指令

    newarray:创建元素为基本数据类型的数组。

    anewarray:创建数据类型为引用类型的数组。

    multianewarray:创建多维数组。

    把一个数组元素加载到操作数栈栈顶的指令:baload、caload、saload、iaload、laload、faload、daload、aaload

    将一个操作数栈栈顶的值存储到数组元素中的指令:bastore、castore、sastore、iastore、fastore、dastore、aastore

    取数组长度的指令:arraylength

    检查类实例类型的指令

    instanceof、checkcast。

    操作数栈管理指令

    pop:将操作数栈的栈顶元素出栈。

    pop2:将操作数栈的栈顶两个元素出栈。

    复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶:dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2

    将栈最顶端的两个数值互换:swap

    控制转移指令

    控制转移指令可以让Java虚拟机有条件或无条件地从指定的位置指令而不是控制转移指令的下一条指令继续执行程序。

    控制转移指令如下:

    • 条件分支:ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull、if_icmpeq、if_icmpne、if_icmplt、if_icmpgt、if_icmple、if_icmpge、if_acmpeq 和 if_acmpne。
    • 复合条件分支:tableswitch、lookupswitch。
    • 无条件分支:goto、goto_w、jsr、jsr_w、ret。

    方法调用指令

    invokevirtual:指令用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),这也是Java语言中最常见的方法分派方式。

    invokeinterface:指令用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用。

    invokespecial:指令用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和父类方法。

    invokestatic:指令用于调用类方法(static方法)。

    invokedynamic:指令用于在运行时动态解析出调用点限定符所引用的方法,并执行该方法,前面4条调用指令的分派逻辑都固化在Java虚拟机内部,而invokedynamic指令的分派逻辑是由用户所设定的引导方法决定的。

    方法调用指令与数据类型无关。

    方法返回指令

    方法返回指令是根据方法的返回值类型区分的,包括ireturn(当返回值是boolean、byte、char、short和int类型时使用)、lreturn、freturn、dreturn 和areturn,另外还有一条return指令供声明为void的方法、实例初始化方法以及类和接口的类初始化方法使用。

    异常处理指令

    在Java程序中显式抛出异常的操作(throw语句)都由athrow指令来实现。

    同步指令

    monitorenter和monitorexit两条指令来支持synchronized关键字的语义。

    常见语法结构对应的字节码指令

    异常处理

    public class SynchronizedDemo {
    
        final Object lock = new Object();
    
        void doLock() {
            synchronized (lock) {
                System.out.println("lock");
            }
        }
    }
    

    对应的字节码如下:

    stack=2, locals=3, args_size=1
       0: aload_0
       1: getfield      #3                  // Field lock:Ljava/lang/Object;
       4: dup
       5: astore_1
       6: monitorenter
       7: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
      10: ldc           #5                  // String lock
      12: invokevirtual #6                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      15: aload_1
      16: monitorexit
      17: goto          25
      20: astore_2
      21: aload_1
      22: monitorexit
      23: aload_2
      24: athrow
      25: return
    Exception table:
       from    to  target type
           7    17    20   any
          20    23    20   any
    

    在synchronized生成的字节码中,其中包含两条monitorexit指令,是为了保证所有的异常条件,都能够退出。

    可以看到,编译后的字节码,带有一个叫Exception table的异常表,里面的每一行数据,都是一个异常处理:

    • from:指定字节码索引的开始位置
    • to:指定字节码索引的结束位置
    • targe:t异常处理的起始位置
    • type:异常类型

    也就是说,只要在from和to之间发生了type异常,就会跳转到target所指定的位置。

    装箱和拆箱

    public class BoxDemo {
    
        public Integer cal() {
            Integer a = 1000;
            int b = a * 10;
            return b;
        }
    }
    

    对应的字节码如下:

     0: sipush        1000
     3: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     6: astore_1
     7: aload_1
     8: invokevirtual #3                  // Method java/lang/Integer.intValue:()I
    11: bipush        10
    13: imul
    14: istore_2
    15: iload_2
    16: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
    19: areturn
    

    通过观察字节码,我们发现装箱和拆箱的本质:

    • 装箱:调用Xxx.valueOf()方法将基本数据类型包装成包装对象。
    • 拆箱:调用Xxx.xxxValue()方法将包装对象转为基本数据类型。

    数组

    package com.morris.jvm.bytecode;
    
    public class ArrayDemo {
        int getValue() {
            int[] arr = new int[]{1111, 2222, 3333, 4444};
            return arr[2];
        }
        int getLength(int[] arr) {
            return arr.length;
        }
    }
    
    

    getValue()方法对应的字节码如下:

    stack=4, locals=2, args_size=1
       0: iconst_4
       1: newarray       int
       3: dup
       4: iconst_0
       5: sipush        1111
       8: iastore
       9: dup
      10: iconst_1
      11: sipush        2222
      14: iastore
      15: dup
      16: iconst_2
      17: sipush        3333
      20: iastore
      21: dup
      22: iconst_3
      23: sipush        4444
      26: iastore
      27: astore_1
      28: aload_1
      29: iconst_2
      30: iaload
      31: ireturn
    LineNumberTable:
      line 5: 0
      line 6: 28
    LocalVariableTable:
      Start  Length  Slot  Name   Signature
          0      32     0  this   Lcom/morris/jvm/bytecode/ArrayDemo;
         28       4     1   arr   [I
    

    可以看到,新建数组的代码,被编译成了newarray指令。

    数组的创建具体操作:

    1. iconst_0:常量0压入操作数栈栈顶。
    2. sipush:将一个常量1111压入操作数栈栈顶。
    3. iastore:将栈顶int型数值存入数组的0索引位置。

    数组元素的访问,是通过第28~30行字节码来实现的:

    1. aload_1:从局部变量表中第二个引用类型的局部变量压入操作数栈栈顶,这个引用就是生成的数组的引用。
    2. iconst_2:将int型2压入操作数栈栈顶。
    3. iaload:将int型数组指定索引的值压入操作数栈栈顶。

    getLength()方法对应的字节码如下:

    0: aload_1
    1: arraylength
    2: ireturn
    

    获取数组的长度,是由字节码指令arraylength来完成的。

    更多精彩内容关注本人公众号:架构师升级之路
    在这里插入图片描述

    展开全文
  • 通常一条指令包括两方面的内容: [1]操作码和操作数,操作码决定要完成的操作,操作数指参加运算的数据及其所在的单元地址。在第2章时我们介绍了MIPS所有指令都是32位的,操作码占用高6位(bit31-bit26)表示,低26...
  • 指令系统

    千次阅读 2015-04-24 10:33:51
    在计算机中有信息流,种是数据流,它是处理的对象;种是控制流,由它来对控制对数据信息的处理。 指令系统的发展   计算机的程序是由系列的指令组成的,指令就是要计算机执行某种操作的命令。  ...
  •  其中 编译预处理阶段,预处理器读取c源程序,进行初步的转换,即对其中的伪指令(以#开头的指令)和特殊符号等进行处理后,翻译得到个ASCII码的中间文件main.i交给编译器。预处理过程在编译时处理包含其他...
  • 指令集: 个给定的计算机体系结构所包含指令集合。    3. 尽管机器语言种类繁多,但彼此之间十分类似,因此其差异性更像人类语言中的“方言”,而并非独立语言,因此,了解其中种机器语言之后,对其他机器...
  • mips指令

    千次阅读 2015-06-24 13:00:40
    因此要想加载任何个32位值,就得用个加载指令。16位的目标地址意味着,指令的跳转或子函数的位置必须在64K以内(上下32K); 3、所有的动作原理上要求必须在1个时钟周期内完成,个动作个阶段; 4、有32个...
  • ○ 从指令系统(指令集)角度定义,在指令系统中拥有用于管理硬件和整个系统安全的指令,让程序随意使用具有极高危险性。不得在用户态(目态)执行,只能在核心态(管态)执行,用户态程序如果运行特权指令将发生...
  • MIPS 指令

    万次阅读 2017-05-10 14:53:27
    MIPS 指令   指令 功能 应用实例 LB 从存储器中读取个字节的数据到寄存器中 LB R1, 0(R2) LH 从存储器中读取半个字的数据到寄存器中 ...
  • 汇编指令之算术指令

    千次阅读 2007-05-18 20:52:00
    算术指令 IBMPC机的算术运算指令包括二进制运算及十进制运算指令。算术指令用来执行算术运算,它们中有双操作数指令,也有单操作数指令。如前所述,双操作数指令个操作数中除源操作数为立即数的情况外,必须有...
  • 计算机如何区分指令和数据(

    万次阅读 多人点赞 2019-09-03 09:44:27
    要了解指令和数据是什么?在计算机中有什么作用?以及它们怎样存储?才能回答如何区分它们以及为何要区分。首先我们要搬出冯诺依曼计算机体系架构,因为它回答了大部分问题。 在冯诺依曼计算机架构体系当中,计算机...
  • 说到SSE,首先要弄清楚的一个概念是SIMD(单指令多数据流,Single Instruction Multiple Data),是一种数据并行技术,能够在一条指令中同时对多个数据执行运算操作,增加处理器的数据吞吐量。SIMD特别的适用于...
  • Angular中的内置指令和自定义指令

    千次阅读 2016-05-05 14:09:23
    NG中的指令,到底是什么(what)? 为什么会有(why)?以及怎样使用(how)? What: 在NG中,指令扩展HTML功能,为 ... How: 指令主要分为种:内置指令和自定义指令,通过下面的例子,简单记录一下如何去使用。 内置
  • 一条指令必须包含信息2. 不同地址码个数的指令3. 从指令执行周期看指令设计涉及的问题三、指令系统设计1. 设计指令系统(1)设计原则(2)设计的重要方面2. 操作数类型和存储方式(1)指令应涉及的基本数据类型...
  • 程序及指令的关系

    千次阅读 2019-04-01 20:18:45
    程序由一条一条指令组成,指令按顺序存放在内存连续单元。 程序的执行:周而复始地执行一条一条指令 正常情况下,指令按其存放顺序执行。 遇到需要改变程序执行流程时,用相应的转移指令来改变程序执行流程。 ...
  • 指令集简介

    万次阅读 2014-01-15 18:22:48
    指令集简介!
  • ZPL指令

    万次阅读 2015-03-11 16:14:38
    ^CC,~CC 改变格式指令前缀  ^CC,~CC(改变脱字符)指令是用于改变指令前缀。缺省前缀是脱字符(^)。 ^CC,~CC指令格式  ^CCx,~CCx ^CC,~CC = 改变脱字符 x = 任何...
  • 指令与周期解释

    2010-04-08 20:22:00
    一条指令分成若干条微指令,按次序执行这些微指令,就可以实现指令的功能。 若干条微指令可以构成一个微程序,而一个微程序就对应了一条机器指令。 因此,一条机器指令的功能是若干条微指令组成的序列来实现的。...
  • 精简指令集和复杂指令集的区别

    万次阅读 多人点赞 2016-03-31 21:57:39
    RISC(精简指令集计算机)和CISC(复杂指令集计算机)是当前CPU的种架构。它们的区别在于不同的CPU设计理念和方法。 CPU架构是厂商给属于同一系列的...比如对于乘法运算,在CISC架构的CPU上,您可能需要这样一条指令:MU
  • SIMD、SSE、AVX指令

    千次阅读 2019-01-11 20:04:37
    指令集是指CPU能执行的所有指令的集合,每一指令对应一种操作,任何程序最终要编译成一条条指令才能让CPU识别并执行。CPU依靠指令来计算和控制系统,所以指令强弱是衡量CPU性能的重要指标,指令集也成为提高CPU效率...
  • JVM之指令重排分析

    万次阅读 2016-08-08 15:49:28
    引言:在Java中看似顺序的代码在JVM中,可能会出现编译器或者CPU对这些操作指令进行了重新排序;在特定情况下,指令重排将会给我们的程序带来不确定的结果....
  • 计算机指令系统

    千次阅读 多人点赞 2020-05-27 12:01:48
    计算机指令系统性的发展,指令系统的性能要求,指令格式,操作数类型,指令和数据的寻址方式。
  • lua指令

    千次阅读 2013-12-04 09:21:32
    A No-Frills Introduction to Lua 5.1 VM Instructions ...这是本关于Lua 5.1 虚拟机指令集的完全介绍。与Perl和Python相比,Lua的简洁性使得有人可以窥它的内幕并理解它的内在实现。如果没有把个“生物
  • Intel汇编指令集SSE4

    千次阅读 2015-05-31 17:42:05
    1、引言 Intel SSE 4指令集是当前使用广泛的汇编指令集,最初在45nm的Intel 64位处理器和AMD的K10处理器中提供。...SSE4指令集共包含了54条指令,其中子集SSE 4.1包含了47条指令,另个子集SSE 4.
  • 谁都能看懂的CPU指令集介绍

    千次阅读 2020-05-26 11:00:23
    MMX指令集中包括了57多媒体指令,通过这些指令可以次性处理多个数据,在处理结果超过实际处理能力的时候仍能够进行正常处理,如果在软件的配合下,可以得到更强的处理性能。使用MMX指令集的好处就是
  • CPU的指令集(指令系统)

    万次阅读 2019-02-06 20:00:09
    CPU的指令集(指令系统)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 122,669
精华内容 49,067
关键字:

一条指令包含两方面的信息