2016-06-07 72 views
1

我的目标是打开一个套接字,连接到一个端口上的套接字,然后每当套接字发送数据给我,我想写它到标准输出。 我的代码工作正常,但由于某种原因,写入的字符串不会终止?我不太确定问题是什么,我还没有找到任何关于它的信息。Mips大会。连接,读取和写入

#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向插座strace的,并将其写入一个\ 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

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

还注意到自己的write系统调用的长度远远大于2

read系统调用后,您有:

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

为写长度被解读为一种无符号数 [和一个非常一]

改变这只是[ie除去negu]:

move $a2,$v0 
+0

另外值得一提的是,“BEQZ $ A3,接下来的”应取出来,因为它会导致永无止境的循环。这次真是万分感谢!! –

+0

是的,你是对的,我已经注意到了。但是,我想尽快解决你的主要问题[我想你自己找到了;-)]。此外,我会扫描并在所有系统调用中添加返回值检查(例如-1 =错误等)。而且,我会在显示意图的每一行上添加边栏评论。看到我的答案在这里http://stackoverflow.com/a/36560575/5382650为我的意思[和其他asm技巧]的解释 –

+0

好吧,我不知道大会太好,它的伟大知道,至少有人知道它。很难在网上找到有关特定问题的信息 –