Mips 大会。连接、读取和写入
Mips Assembly. Connect, read, and write
我的objective是打开一个套接字,在一个端口上连接到那个套接字,然后每当那个套接字向我发送数据时,我想把它写到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:
这是我将 a\n 写入套接字的 strace,并将 a\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[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]"..., 49a
zi3▒ݤ) = 49
如你所见,它在最后打印出一些奇怪的字符。感谢您的帮助!
请注意,在您的 strace
输出中,您的 read
系统调用 returns 值为 2 [在 $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
我的objective是打开一个套接字,在一个端口上连接到那个套接字,然后每当那个套接字向我发送数据时,我想把它写到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:
这是我将 a\n 写入套接字的 strace,并将 a\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[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]"..., 49a
zi3▒ݤ) = 49
如你所见,它在最后打印出一些奇怪的字符。感谢您的帮助!
请注意,在您的 strace
输出中,您的 read
系统调用 returns 值为 2 [在 $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