我正在为我的实验室开发一个操作系统项目,我将使用指令指针和指令操作码.现在我需要知道的是它是什么类型的指令.为此,我正在从指令指针指向的地址读取数据.这个数据的第一个字节给出了指令类型.例如,如果第一个字节是0xC6
它是一个MOVB
指令.现在有些情况下指令指针的第一个字节是0x0F
.根据文档0x0F
,这意味着它是一个双字节指令.我的问题是这种类型的指令.我不知道如何找出双字节指令的指令类型.
在那之后,我的第二个优先级是两个找出指令的操作数.我不知道从代码中做到这一点.任何示例代码将不胜感激
第三,需要找出指令的大小.由于x86是可变长度的,我想知道每条指令的大小.起初我打算使用查找表,我将维护指令名称及其大小.但后来我发现同一条指令的长度可变.例如,当我在.o
文件上使用对象转储时,我发现了两个C6 00 62
用于MOVB $0x62,(%EAX)
&的C6 85 2C FF FF FF 00
目的指令MOVB $0x0,-0xD4(%EBP)
.看这里两个指令类型相同(C6
)但是长度不同.
所以我需要回答这些问题.如果有人能给我一些解决方案,我们将非常感激.
我在go
. 从服务器端我尝试一次读取 1024 字节的数据。从客户端我使用该io.Copy
功能来传输文件。文件传输的成功率为 70%。但有 30% 的时间它会失败。它陷入了connection.Read
功能困境。Read
通过一些实验,我发现这种情况仅发生在先前操作读取的数据少于字节的情况下1024
。
因此,从我的代码来看,理想情况下它应该读取1024
所有连续的数据字节,除了文件传输完成的Read
最后一个。Read
但在某些情况下,如果读取的字节数少于1024
字节,则下一个Read
操作将被卡住,而不会引发任何错误。这是我的代码:
服务器.go
fileBuffer := make([]byte, BUFFER_SIZE) //BUFFER_SIZE is a constant of 1024
bytesRead := int64(0)
count := 0
for {
if fileSize-bytesRead < int64(BUFFER_SIZE) { //fileSize is the size of file in bytes, which I calculated earlier.
fileBuffer = make([]byte, fileSize-bytesRead)
}
fmt.Println("Reading ", BUFFER_SIZE, " bytes of data")
n, err := connection.Read(fileBuffer) …
Run Code Online (Sandbox Code Playgroud)我对C++中的内存解除分配感到困惑.我有一个结构
struct Node{
Node* left;
Node* right;
};
Run Code Online (Sandbox Code Playgroud)
我将Node类型的指针声明为:
struct Node* myNode = new Node;
现在,如果我这样delete myNode
做,它还取消分配left
和right
指针内部myNode
?如果没有,如果我们在Node
类型内部有很多指针并且在没有内存泄漏的情况下编写代码将会非常困难,那会不会非常繁琐?