1. 汇编语言 怎么辨别单字节指令 双字节指令 三字节指令
汇编语言是根据指令的类别和完成的功能来识别指令的单双还是三字节指令的,比如:
INC A;累加器加1,不会与任何其他操作数发生关系,所以是单字节指令。
SJMP TTT;短转移,因为TTT在正负127之内,不会超过一个字节,所以是双字节指令。
LJMP TTT;长转移,因为地址为十六位,所以是三字节指令。
2. c语言中的SHORT是什么意思
1、short和int等一样,是C或C++的一种内部数据类型。用于表示有符号整数。不同的是,他们在内存中所占的空间大小不同,short通常为int所占一半,也有一些实现为和int一样,但不会比int大。所占内存空间不同,那么可用表示的整数范围也就不同。至于具体能表示什么范围,这个问题是体系结构和编译环境相关的。
2、以下例程输出各种整型类型的大小:
#include<iostream>
usingnamespacestd;
intmain()
{
cout<<sizeof(short)<<endl;
cout<<sizeof(int)<<endl;
cout<<sizeof(long)<<endl;
cout<<sizeof(__int64)<<endl;
}
在VC8上编译运行结果是
2
4
4
8
也就是说short占2字节(byte),int和long一样占4字节,__int64占8字节,占字节数越多,所能表示的数的范围越大。
3. 为什么单片机中CJNE,JNB,JB这几条指令可实现的转移范围是负的128到127
单片机跳转指令解析
控制转移类指令
条件转移指令Jcc根据指定的条件确定程序是否发生转移。如果满足条件则程序转移到目标地址去执行程序;不满足条件,则程序将顺序执行下一条指令。
其通用格式为:
Jcc LABEL ;条件满足,发生转移:IP?IP+8位位移量
;否则,顺序执行:IP?IP+2 其中,LABEL表示目标地址(8位位移量)。因为Jcc指令为2个字节,所以顺序执行就是指令偏移指针IP加2。条件转移指令跳转的目标地址只能用前面介绍的段内短距离跳转(短转移),即目标地址只能是在同一段内,且在当前IP地址-128~+127个单元的范围之内。这种寻址方式由于是相对于当前IP 的,所以被称为相对寻址方式。条件转移指令不影响标志,但要利用标志。条件转移指令Jcc中的cc表示利用标志判断的条件,共16种。如下图:
1、判断单个标志位状态
这组指令单独判断5个状态标志之一,根据某一个状态标志是0或1决定是否跳转。
(1)JZ/JE和JNZ/JNE利用零标志ZF,判断结果是否为零(或相等)
JE指令(相等时转移)
JZ指令(等于0时转移)
这是当ZF=1时转移到目标地址的条件转移指令的两种助记符。这条指令既适用于判断无符号数的相等,又适用于判断带符号数的相等。
JNE指令(不相等转移)
JNZ指令(不等于0转移)
这是当ZF=0时能转移到目标地址的条件转移指令的两种助记符。这条指令也是既适用于判断无符号数,又适用于判断带符号数。
(2)JS和JNS利用符号标志SF,判断结果是正是负。
JS指令(为负转移)——当满足SF=1时,转移到目标地址
JNS指令(为正转移)——满足SF=0时,转移到目标地址
(3)JO和JNO利用溢出标志,判断结果是否产生溢出
JO指令(溢出转移)——OF=1时,转移到目标地址 JNO指令(未溢出转移)——OF=0时,转移到目标地址
(4)JP/JPE和JNP/JPO利用奇偶标志PF,判断结果中“1”的个数是偶是奇
JP/JPE指令(为偶转移)——满足PF=1时转移 JNP/JPO指令(为奇转移)——满足PF=0时转移 数据通讯为了可靠常要进行校验。常用的校验方法是奇偶校验,即把字符ASCII码的最高位用作校验位,是包括校验位在内的字符中为“1”的个数恒为奇数(奇校验),或恒为偶数(偶校验)。若采用奇校验,在字符ASCII中为“1”的个数已为奇数时,则令其最高位为“0”;否则令最高位为“1”。
(5)JC/JB/JNAE和JNC/JNB/JAE,利用进位标志CF,判断结果是否进位或借位,CF标志是比较常用的一个标志。 JC——满足CF=1时转移 JNC——满足CF=0时转移
JB(低于转移) JNB(不低于转移) JNAE(不高于等于转移) JAE(高于等于转移) 2、用于比较无符号数高低为区别有符号数的大小,无符号数的大小用高(Above)、低(Below)表示,它需要利用CF确定高低、利用ZF标志确定相等(Equal)。两数的高低分成4种关系:低于(不高于等于)、不低于(高于等于)、低于等于(不高于)、不低于等于(高于);也就分别对应4条指令:JB(JNAE)、 JNB(JAE)、JBE(JNA)、JNBE(JA)。 JA/JNBE
JA即高于转移,JNBE即不低于且不等于转移,高于则没有进位产生,即CF=0,不等于则ZF=0,所以这两条指令满足CF=0且ZF=0时转移
JAE/JNB
高于或等于转移/不低于转移是当CF=0(高于就不产生进位)或ZF=1(等于)时转移。
JB/JNAE
即低于/不高于且不等于转移,是当CF=1(产生借位)且ZF=0(不相等)时转移。
JBE/JNA
即低于或等于/不高于转移,是当CF=1(借位产生)或ZF=1(相等)时转移。
3、用于比较有符号数大小
判断有符号数的大(Greater)、小(Less),需要组合OF、SF标志、并利用ZF标志确定相等与否。两数的大小分成4种关系:小于(不大于等于)、不小于(大于或等于)、小于等于(不大于)、不小于等于(大于);也就分别对应4条指令:JL(JNGE)、JNL(JGE)、JLE(JNG)、 JNLE(JG)。
由上可见,条件转移指令之前常有CMP、TEST、加减运算、逻辑运算等影响标志的指令,利用这些指令执行后的标志或其组合状态形成条件。
JG/JNLE
大于/不小于且不等于转移,是当标志SF与OF同号(即<SF异或OF>=0)且ZF=0时转移
JGE/JNL大于或等于/不小于转移,是当标志SF与OF同号(即<SF异或OF>=0)或ZF=0时转移
JL/JNGL
小于/不大于也不等于时转移,是当标志SF与OF异号(即<SF异或OF>=1)且ZF=0时转移
JLE/LNG
小于或等于/不大于转移,是当标志SF与OF异号(即<SF异或OF>=1)或ZF=1时转移
4、判断计数器CX是否为0
JCXZ LABEL ;CX=0,则转移;否则顺序执行
4. 本人编写了一个简单C程序,在VS2013软件编译运行,short本身占2个字节,却%x打印出了一个32位数
%x对应的是int类型
所以 用%x默认会把参数转为int
而-2转为int, 值不变, 16进制值为0xfffffffe
unsigned short 赋值为-2的时候, 会根据-2的补码,转为对应的无符号值,也就是65534
用%x输出时,还是转为int 值还是65534, 所以会输出fffe
5. 编译器定义长整形占4个字节,短整型占2个字节有什么用处体现在哪里
可以容纳的大小不同,4个字节就是可以到2^32 - 1 , 2个字节就只能到 2^16 - 1
6. 设相对寻址的转移指令占2个字节,第一个字节为操作码,第二个字节是位移量(用补码表示),每当CPU从
先取指令,每取一字节,pc+1,转移指令共两字节,取指后pc=300AH,转移到300FH的位移量为05H(真值),补码表示为0000 0101即05H(正数原码补码形式一致)
当前指令地址为300FH,要求转移到3004H。取指令后,pc=3011H,位移量为-07H,补码表示为1111 1001即F9H
答案我不确定,大体思想就酱
7. 51单片机的汇编指令中AJMP 和SJMP都是两个字节,都是两个机器周期,它们有什么区别呢
AJMP是短转移指令。其转移范围为当前指令地址高5位相同的2K范围。
SJMP为相对转移指令。其转移范围为当前指令地址-128~+127范围。
8. C语言高手快进来!!
C/C++中的基本类型,比如int所占用的字节数是不确定的,具体是和系统或编译器实现相关的。比如32位系统就可能是int占4个字节,而16位系统int占2个字节
而java中由于跨平台的需要,所有基本类型都是定死的,比如int无论在哪都占用4个字节
9. 【计算机体系结构】什么叫转移指令(无条件转移,条件转移)
控制转移指令通过改变CS:IP来控制程序的执行流程。这类指令包括无条件转移指令、条件转移指令、循环指令、子程序调用和返回指令以及中断和中断返回指令。
⑴无条件转移
JMP跳转
⑵条件转移
JZ/JNZ结果为零/不为零则转移
JS/JNS结果为负/为正则转移
JO/JNO溢出/不溢出则转移
JP/JNP奇偶位为1/为0则转移
JB/JNB低于/不低于则转移
JBE/JNBE低于等于/高于则转移
JL/JNL小于/不小于则转移
JLE/JNLE小于等于/大于则转移
JCXZCX为零则转移
⑶循环指令
LOOP循环
LOOPZ/LOOPE为零/相等时循环
LOOPNZ/LOOPNE不为零/不等时循环
⑷子程序调用与返回
CALL调用
RET返回
⑸中断及中断返回
INT中断
INTO溢出则中断
IRET中断返回
程序中指令的执行顺序是由CS:IP来决定的,程序转移类指令可改变IP或CS、IP的内容,从而控制指令的执行顺序,实现指令转移、程序调用等功能。
1无条件转移指令
JMP指令控制程序无条件地跳转到目的单元,使用JMP指令可有三种格式:
⑴JMPSHORTlabel短转移(shortjump)
⑵JMPNEARPTRlabel近转移(nearjump)
●JMPlabel直接转移(directjump)
●JMPreg寄存器间接转移(registerindirectjump)
●JMPWORDPTROPR存储器间接转移(memoryindirectjump)
⑶JMPFARPTRlabel远转移(farjump)
短转移的目标地址(或称转向地址)相对于当前IP值的位移量在-128至+127字节之间,当前IP值是指JMP指令的下一条指令的地址(如图3.11所示)。对短转移JMP,机器指令的第一个字节为操作码EB,第二个字节为位移量00~FF,这是一个带符号的补码数。转向地址的计算方法为:(IP)当前+8位位移量。操作符SHORT指示汇编程序将JMP指令汇编成一个2字节指令。
⑴JMPSHORTlabel短转移(shortjump)
执行操作:(IP)←(IP)当前+8位位移量
短转移示意图
⑵JMPNEARPTRlabel近转移(nearjump)
近转移是JMP指令的缺省格式,可以写为"JMPlabel"。它可在当前代码段内转移,机器指令的操作码是E9,位移量是16位的带符号补码数。指令中的转向地址可以是直接寻址方式、寄存器寻址方式、寄存器间接方式和存储器寻址方式。
●JMPlabel直接转移(directjump)
执行操作:(IP)←OFFSETlabel=(IP)当前+16位位移量
转移的目标地址在指令中可直接使用符号地址,由于位移量为16位,它的转移范围应是-32768至+32767,也就是说,近转移指令可以转移到段内的任一个位置。
●JMPreg寄存器间接转移(registerindirectjump)
执行操作:(IP)←(reg)
转移的目标地址在寄存器中,例如指令"JMPBX"执行的结果,将BX的内容送给IP。
●JMPWORDPTROPR存储器间接转移(memoryindirectjump)
执行操作:(IP)←(PA+1,PA)
存储器的物理地址PA由指令中的寻址方式确定,JMP指令执行的结果,把PA单元的字内容送到IP寄存器中。例如"JMPWORDPTR[DI]",物理地址PA=(DS)×24+(DI),指令执行的结果是(IP)=(PA+1,PA)。
⑶JMPFARPTRlabel远转移(farjump)
执行操作:(IP)←label的段内偏移地址
(CS)←label所在段的段地址
远转移实现的是段间的跳转,即从当前代码段跳转到另一个代码段中,这意味着指令执行后,不仅要改变IP的值,CS也会得到一个新的段地址。在汇编指令中,远转移的目标地址也可以使用除立即寻址方式外的任何寻址方式来表示。
2条件转移指令(conditionaljump)
条件转移指令是在满足了规定的条件后才控制程序转移的一类指令,8086的条件转移指令总结在表3.4中。
所有条件转移指令都是短转移指令,转移的目标地址必须在当前IP地址的-128至+127字节范围之内,因此条件转移指令是2字节指令。
计算转向地址的方法和无条件短转移指令是一样的,看例3.40的反汇编代码。
例3.40程序中的"JNZAGAIN"汇编成"JNZ000D",000D是标号AGAIN的地址,指令"JNZ000D"的机器代码是75FA,75是操作码,FA是位移量。当CPU读取JNZ指令后,IP寄存器自动加2(JNZ的指令长度)指向了下一条指令(MOV),此时IP的当前值是0013。计算转向地址时,(IP)当前+位移量=0013+FA=0013+FFFA=000D,这正是AGAIN的偏移地址。实际上FA是-6的补码,8位的FA与16位的0013相加时,FA符号扩展成为FFFA,相加的加结果为000D。
表3.4条件转移指令分类 指令 转移条件 说明
(Ⅰ) JZ/JE ZF=1 为零/相等,则转移
JNZ/JNE ZF=0 不为零/不相等,则转移
JS SF=1 为负,则转移
JNS SF=0 为正,则转移
JO OF=1 溢出,则转移
JNO OF=0 不溢出,则转移
JP PF=1 奇偶位为1,则转移
JNP PF=0 奇偶位为0,则转移
JC CF=1 进位位为1,则转移
JNC CF=0 进位位为0,则转移
(Ⅱ) JB/JNAE/JC CF=1 低于/不高于等于,则转移
JNB/JAE/JNC CF=0 不低于/高于等于,则转移
JBE/JNA (CFZF)=1 低于等于/不高于,则转移
JNBE/JA (CFZF)=0 不低于等于/高于,则转移
(Ⅲ) JL/JNGE (SFOF)=1 小于/不大于等于,则转移
JNL/JGE (SFOF)=0 不小于/大于等于,则转移
JLE/JNG ((SFOF)ZF)=1 小于等于/不大于,则转移
JNLE/JG ((SFOF)ZF)=0 不小于等于/大于,则转移
(Ⅳ) JCXZ (CX)=0 CX的内容为0,则转移
注:(Ⅰ)根据条件码的值转移(Ⅱ)比较两个无符号数,根据比较的结果转移
(Ⅲ)比较两个带符号数,根据比较的结果转移(Ⅳ)根据CX寄存器的值转移
例
1050:0000B86610MOVAX,1040
1050:00038ED8MOVDS,AX
1050:0005B90500MOVCX,0005
1050:0008BB0000MOVBX,0000
1050:000D0207AGAIN:ADDAL,[BX]
1050:000F43INCBX
1050:001049DECCX
1050:001175FAJNZ000D
1050:0013A20500MOV[0005],AL
1050:0016B44CMOVAH,4C
1050:0018CD21INT21
例假设程序进行两个带符号数的比较,并根据比较结果转移,其中(AL)=80H,(BL)=01,请指出下面两组指令的转向地址。
⑴CMPAL,BL⑵CMPAL,BL
JLXYJBXY
答:⑴转向目标地址XY;⑵不能实现转移。
执行CMP指令时,(AL)-(BL)=80-01=7F,条件码设置为:SF=0,OF=1,CF=0。执行JL指令时,测试转移条件:SFOF=01=1,说明满足(AL)<(BL)的转移条件,因此,(IP)←XY的偏移地址,程序即转移到XY单元执行新的指令。
JB指令的转移条件为CF=1,而CMP的执行结果使CF=0,所以不能引起转移。
10. 设相对寻址的转移指令占两个字节
PC当前值为240,该指令取出后PC值为243,要求转移到290,即相对位移量为290-243=47,转换成补码为2FH。由于数据在存储器中采用以低字节地址为字地址的存放方式,故该转移指令的第二字节为2FH,第三字节为00H。