小编Dis*_*kai的帖子

Windows系统调用

我对使用Linux上的系统调用进行汇编(非常)有基本的了解(我使用GNU汇编程序as).在Windows 7上,我使用GCC编译器套件的MinGW(32位)端口来生成汇编程序.在Linux上我经常使用C库在我的汇编程序中进行一些操作系统交互,在我的Windows平台上,使用MinGW也可以很好地工作.但是,有时我想使用低级系统调用 - 主要是为了使我的可执行文件尽可能小.在Linux上我知道如何做到这一点:

movl        $0, %ebx
movl        $1, %eax
int $0x80   ; exit with code 0
Run Code Online (Sandbox Code Playgroud)

我还使用这些系统调用来读取/写入终端的字符(例如,在EAX中编写带有4的系统调用).我想知道如何在Windows NT平台上执行此操作.可能吗?我查看了这个表,但我真的不明白系统调用的名称.欢迎任何帮助.

windows assembly

14
推荐指数
1
解决办法
1万
查看次数

QTcpSocket:读写

我知道可能已经提出了一些类似的问题,但我找到的答案涵盖了非常具体的问题,我仍然没有想出来.

在我的程序中,我正在创建一个QObject(称为QPeer),它使用QTcpSocket通过网络与另一个这样的对象进行通信.QPeer有一个插槽,可以接受带有data(sendData(QByteArray))的QByteArray .该数组的全部内容被视为一个"消息",并将它们写入套接字.我想要执行以下操作:每次写入消息时,我都希望接收QPeer只发出dataReceived(QByteArray)一次信号,即包含整个消息的QByteArray.(注意:所有信号/插槽,都是连接QPeer及其插座的私有信号/插槽,以及必要时sendData(QByteArray)使用的序列化的公共信号/插槽Qt::QueuedConnection.)

我使用信号QTcpSocket::readyRead()从套接字异步读取.现在我知道我不能只QTcpSocket::write()在sendData中调用一次,然后假设对于我做的每次写操作,另一端的QTcpSocket只生成一个readyRead信号.所以我该怎么做?

这是我的想法,请告诉我这是否有效:

写作:

void QPeer::sendData(QByteArray data)
{
    // TODO: write data.size() as raw int of exactly 4 bytes to socket
    const char *bytes = data.constData();
    int bytesWritten = 0;
    while (bytesWritten < data.size())
        bytesWritten += _socket->write(bytes + bytesWritten);
}
Run Code Online (Sandbox Code Playgroud)

读:

现在我希望read函数(连接到QTcpSocket::readyRead())使用头(指定消息长度的4字节int),然后读取该字节数; 接下来用恰好那些字节发出dataReceived.我在尝试这样做时遇到了严重的麻烦.例如:如果发出readyRead怎么办,我可以读取消息的标题,但不是指定的字节数?或者如果仅部分收到标题会怎么样?

1.如何正确地将标头(4字节int)写入套接字?

2.如何正确实现读取功能,使其达到我想要的效果?

欢迎任何提示.谢谢!

c++ sockets qt

9
推荐指数
1
解决办法
8万
查看次数

ELF可执行问题

我在linux上有一些关于ELF可执行文件的奇怪问题.

这是我的系统(uname -a):

Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u2 (2016-01-02) x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

我有以下程序(test.asm),我使用NASM组装它:

; program just exits with code 0 using linux INT 80H

SECTION .data
SECTION .text
GLOBAL _start

_start:
    MOV EAX, 1
    XOR EBX, EBX
    INT 0x80
Run Code Online (Sandbox Code Playgroud)

我创建三个不同的可执行文件:

nasm -f elf32 -o test32-i386.o test.asm
ld -m elf_i386 -o test32-i386 test32-i386.o

nasm -f elfx32 -o test32-x86_64.o test.asm
ld -m elf32_x86_64 -o test32-x86_64 test32-x86_64.o

nasm -f elf64 -o test64-x86_64.o test.asm
ld -m elf_x86_64 -o test64-x86_64 test64-x86_64.o
Run Code Online (Sandbox Code Playgroud)

这是file …

linux elf

5
推荐指数
1
解决办法
1259
查看次数

标签 统计

assembly ×1

c++ ×1

elf ×1

linux ×1

qt ×1

sockets ×1

windows ×1