我需要帮助理解x86处理器的CPU寄存器内的字节序.我写了这个小装配程序:
section .data
section .bss
section .text
global _start
_start:
nop
mov eax, 0x78FF5ABC
mov ebx,'WXYZ'
nop ; GDB breakpoint here.
mov eax, 1
mov ebx, 0
int 0x80
Run Code Online (Sandbox Code Playgroud)
我在GDB中使用第10行的断点运行此程序(在上面的源代码中注释).在此断点,info registers显示的数值eax=0x78ff5abc和ebx=0x5a595857.
由于W,X,Y,Z的ASCII码分别为57,58,59,5A; 并且intel是小端,0x5a595857似乎是正确的字节顺序(最低有效字节优先).那么为什么不是eax寄存器的输出0xbc5aff78(数字0x78ff5abc的最低有效字节)而不是0x78ff5abc?
我对这种东西很困惑,作为最终命令我应该发送什么,总是把8位纠缠到1个字节,但我们如何制作呢?是否只有屏幕截图中显示的命令包[hex]?或是两个屏幕截图中显示的标题+命令包[hex]?
混乱细节:
在这样的图表中,标题块显示大部分像"位7,位6,..,位0"而不是"位0,位1,位2,...位7",我总是想知道为什么?
但是当我在代码中应用字节st [0] =位7或位1的顺序时?
同样根据这个图表,它是否意味着我发送的每个命令都会始终修复Header?
这是我尝试的代码,将位1作为st [0],位2作为st 1而不是位7作为st [0].应用电源关/开测试.
import java.io.*;
import java.net.*;
public class test
{
public static void main(String[] args) throws UnknownHostException, IOException
{
byte st[]=new byte[256];
st[0]=0x01; // get
st[1]=0x02; // header 2 byte
st[2]=0x02; // header length
st[3]=0; // command byte
st[4]=0; // reserved
st[5]=0;
st[6]=0;
st[7]=0;
st[8]=0x01; // power off
st[9]=0x30;
st[10]=0x01;
st[11]=0x00;
System.out.println(st); // Should this work, am i correct based on diagram?
Socket s = new Socket("192.168.1.2", 49137);
DataInputStream input …Run Code Online (Sandbox Code Playgroud)如何在scala中以块的形式读取二进制文件.
这就是我想要做的
val fileInput = new FileInputStream("tokens")
val dis = new DataInputStream(fileInput)
var value = dis.readInt()
var i=0;
println(value)
Run Code Online (Sandbox Code Playgroud)
打印的值是一个巨大的数字.而它应该返回1作为第一个输出