2016-06-07 1 views
1

내 목표는 소켓을 열고 포트의 해당 소켓에 연결 한 다음 해당 소켓이 데이터를 보내면 언제든지 표준 출력에 쓰려는 것입니다. 내 코드는 정상적으로 작동하지만 어떤 이유로 인해 쓰고있는 문자열이 null로 종료되지 않습니까? 문제가 무엇인지 확신 할 수 없으며 온라인상에서 아직 어떤 것도 찾지 못했습니다. 여기 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 syscall이 2 [$v0]의 값을 반환합니다.

또한 많은 당신의 read 콜 후 2보다

은 당신이 당신의 write 콜은 길이가 통지 : 쓰기의 길이는 부호로 해석되었다

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

[ 및 매우 하나]

그냥 [ie 제거 negu] :

move $a2,$v0 
+0

또한 가치가 끝없는 루프 원인이됩니다 "$ A3 beqz, 다음"밖으로 이동해야한다는 지적입니다. 감사합니다!! –

+0

예, 당신은 정확하고, 나는 그 사실을 알고있었습니다. 그러나, 나는 당신의 주요한 문제를 빨리 풀고 싶었다. [나는 당신이 스스로 그것을 발견했다고 생각했다 ;-)]. 또한 청소를하고 모든 syscalls에 대한 반환 값 확인을 추가합니다 (예 : -1 = 오류 등). 그리고, 의도를 보여주는 각 줄에 사이드 바 주석을 넣었습니다. 내 대답을 참조하십시오 http://stackoverflow.com/a/36560575/5382650 내 뜻 [그리고 다른 ASM 팁]에 대한 설명을 위해 –

+0

좋아, 나도 잘 모르겠다. 그것에 대해 알고 있습니다. 특정 문제에 대해 온라인으로 정보를 찾는 것이 매우 어렵습니다. –