采用顺序寻址方式指令码长度最长。
指令的寻址方式有以下两种。
一、顺序寻址方式由于指令地址在内存中按顺序安排,当执行一段程序时,通常是一条指令接一条指令地顺序进行。也就是说,从存储器取出第1条指令,然后执行这条指令。接着从存储器取出第2条指令,再执行第二条指令。接着再取出第3条指令。
这种程序顺序执行的过程,称为指令的顺序寻址方式。为此,必须使用程序计数器(又称指令指针寄存器)PC来计数指令的顺序号,该顺序号就是指令在内存中的地址。
二、跳跃寻址方式
当程序转移执行的顺序时,指令的寻址就采取跳跃寻址方式。所谓跳跃,是指下条指令的地址码不是由程序计数器给出,而是由本条指令给出。注意,程序跳跃后,按新的指令地址开始顺序执行。因此,程序计数器的内容也必须相应改变,以便及时跟踪新的指令地址。
采用指令跳跃寻址方式,可以实现程序转移或构成循环程序,从而能缩短程序长度,或将某些程序作为公共程序引用。指令系统中的各种条件转移或无条件转移指令,就是为了实现指令的跳跃寻址而设置的。
有一段程序:内存地址 机器码 汇编指令
1000:0 b8 00 00 mov ax,0--B8H 00H 00H 共三字节
1000:3 e8 01 00 call s---也是三字节
1000:6 40 inc ax---仅有40H一个字节
1000:7 58 s:pop ax--也是一字节
-------------------------------
是不是看它的机器码,两位为一个字节?--是的。
怎么去算它的8位或是16位位移量?-- 一般不用人工计算,可由编译软件自动计算。
// get length of file
#include <iostream> // std::cout
#include <fstream> // std::ifstream
int main () {
std::ifstream is ("testtxt", std::ifstream::binary);
if (is) {
// get length of file:
isseekg (0, isend);
int length = istellg();
std::cout << "Binary length: " << length <<std::endl;
}
return 0;
}
from >
那就要看CPU怎么识别机器码了,
比如
MOV
AL,00
的机器码是
1011
0000
0000
0000b
(B000h)
MOV
的机器码是
1011
AL
的机器码是
0000
CPU读取一条指令,假如第一个字节是B0,那么
就是MOV
AL,后面紧跟着的一个字节就是要传进去的立即数(CPU判定这条指令长度2个字节)
再者
MOV
AL,[0000]
的机器码是
1010
0000
(后面16位0)
如果这个字节是A0,那么就是寄存器间接寻址的MOV
AL,后面紧跟着的16位就是地址偏移量
(CPU就判定这条指令长度3个字节)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
写好后用debug反汇编,u命令
1814:0000
33C0
XOR
AX,AX
1814:0002
A08000
MOV
AL,[0080]
其中的
33C0
和
A08000
等就是指令的机器码
就看出来占几个字节了
看你用哪种汇编语言了,NASM中是
message db 'hello, world'
msglen equ $-message
$:当前语句的地址
NASM中变量和标签是一样的
应该没有直接的指令吧。要是有的话,它需要两个 *** 作数,一个是字符串的首字符的地址,一个是末字符的地址,那么它不就是减法指令吗。
计算机取指令是按字节来取的,一条指令有几个字节就取几次。8086的指令根据需要可以是一个字节也可以是两个字节,最多六个字节,也就是采用可变长度的指令。
8086CPU内部的BIU部件里有个指令队列(六个字节),是用来暂时存放从内存取出来的指令,CPU要执行指令时再从指令队列中取出全部的机器码。
以上就是关于采用什么寻址方式指令码长度最长全部的内容,包括:采用什么寻址方式指令码长度最长、汇编语言每个指令的字节数是多少、C++用什么命令获取一个2进制的文件的长度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)