Mips装配。连接,读取和写入

时间:2016-06-07 03:45:21

标签: sockets assembly mips

我的目标是打开一个套接字,连接到端口上的那个套接字,然后每当该套接字向我发送数据时,我想将它写入stdout。 我的代码工作正常,但由于某种原因,写入的字符串不为null终止?我不太确定问题是什么,我还没有在网上找到任何关于它的信息。

#socket(2,1,0)
li      $t7, -6
nor     $t7, $t7, $zero
addi    $a0, $t7, -3
addi    $a1, $t7, -3
slti    $a2, $zero, -1
li      $v0, 4183
syscall 0x40404
sw      $v0, -4($sp)
#connect(3, &addr, 16)
lw      $a0, -4($sp)
li      $t7, -3
nor     $t7, $t7, $zero
sw      $t7,-32($sp)
lui     $t6,0x7a69
ori     $t6,$t6,0x7a69
sw      $t6, -28($sp)
lui     $t5, 0x7F00
ori     $t5, $t5, 0x1
sw      $t5, -26($sp)
addiu   $a1, $sp, -30
li      $t4, -17
nor     $a2, $t4, $zero
li      $v0, 4170
syscall 0x40404

#read(3, addr, 50)
nex:
    lw      $a0, -4($sp)
    addiu   $a1, $sp,-64
    li      $a2, 50
    addi    $a2, $a2, -1
    li      $v0, 4003
    syscall 0x40404
    beqz    $a3, next
    move    $a2,$v0
    negu    $a2,$v0
next:
    blez    $a2,nextt
    #write(1, addr, 50)
    li $a0, 1
    li $v0, 4004
    syscall 0x40404
    j nex
nextt:

这是我在套接字上写一个\ n的字符串,它将\ n \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0写入标准输出。

socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(31337), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
read(3, "a\n", 49)                      = 2
write(1, "a\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 49a
zi3▒ݤ) = 49

正如你所看到的,它最后打印出一些奇怪的字符。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

请注意,strace输出中read系统调用返回的值为[$v0]。

另请注意,您的write系统调用的长度远大于2。

你的read系统调用之后:

    move    $a2,$v0    # this reg has 2
    negu    $a2,$v0    # BUG: this changes it to -2 (0xFFFFFFFE)

写入的长度被解释为无符号号[和一号]

将此更改为[即]删除negu]:

    move    $a2,$v0