首页 > 解决方案 > 在 x86 asm 中添加 32 位错误字节序数

问题描述

我正在推出我自己的 TCP/IP 堆栈。网络字节顺序与 PC 字节顺序不同,当我使用 linux tcpdump 在自己的堆栈上运行测试时,我看到了这一点。

如果我采用 16 位网络值并且我想将原始值增加 1,我可以使用这种代码(在所有情况下,网络值都被声明为双字):

mov AX,[CS:networkvalue]
xchg AL,AH
inc AX
xchg AL,AH
mov [CS:networkvalue],AX

但是我将如何成功地使用 32 位值呢?因为这种代码:

mov EAX,[CS:networkvalue]
inc EAX
mov [CS:networkvalue],EAX

不能正常工作。

我问这个的原因是因为我想获取远程数据包的序列号,增加它然后将其作为确认发送出去,并且两个值都是 32 位的。

我唯一能想到的就是这个,但我可能会离开:

mov BL,[CS:networkvalue]
mov BH,[CS:networkvalue+1]
mov CL,[CS:networkvalue+2]
mov CH,[CS:networkvalue+3]
mov [CS:networkvalue],CH
mov [CS:networkvalue+1],CL
mov [CS:networkvalue+2],BH
mov [CS:networkvalue+3],BL
mov EAX,[CS:networkvalue]
inc EAX
mov [CS:networkvalue],EAX
mov BL,[CS:networkvalue]
mov BH,[CS:networkvalue+1]
mov CL,[CS:networkvalue+2]
mov CH,[CS:networkvalue+3]
mov [CS:networkvalue],CH
mov [CS:networkvalue+1],CL
mov [CS:networkvalue+2],BH
mov [CS:networkvalue+3],BL

知道如何解决我的问题吗?

而且我更喜欢适用于较旧(例如 386' 或 486' 型号 PC)的答案,因为我正在为较旧的流行游戏制作网络软件。

标签: assemblyx86network-programmingendianness32-bit

解决方案


推荐阅读