.include "segment.inc" pSeg2 = pSeg1 + 4 pSeg1 = retaddr + 4 retaddr = oldEbp + 4 oldEbp = 0 p1 = oldEbp - 4 p2 = p1 - 4 n = p2 - 4 .text .global cmpSegment cmpSegment: pushl %ebp movl %esp,%ebp addl $n, %esp pushl %ebx # p1 = pSeg1->origin + pSeg1->offset; movl pSeg1(%ebp), %eax movl segment_origin(%eax), %ebx addl segment_offset(%eax), %ebx movl %ebx, p1(%ebp) # p2 = pSeg2->origin + pSeg2->offset; movl pSeg2(%ebp), %eax movl segment_origin(%eax), %ebx addl segment_offset(%eax), %ebx movl %ebx, p2(%ebp) # n = (pSeg1->length < pSeg2->length) ? pSeg1->length : pSeg2->length; # I am hacking this so that n = pSeg1->length because # the two segment are guaranteed to be the same # eax is already pSeg2 movl segment_length(%eax), %ebx movl %ebx, n(%ebp) loop: # if n == 0, exit the loop cmpl $0,n(%ebp) jz loop_exit movl p1(%ebp),%eax movb (%eax),%bl movl p2(%ebp),%eax cmpb %bl,(%eax) jnz loop_exit cmpb $0,%bl jz loop_exit addl $1,p1(%ebp) addl $1,p2(%ebp) subl $1,n(%ebp) jmp loop loop_exit: # if (n == 0 || (*p1 == *p2)) cmpl $0,n(%ebp) jz then1 # n <> 0, better check *p1 == *p2 movl p1(%ebp),%eax movb (%eax),%bl movl p2(%ebp),%eax cmpb %bl,(%eax) jnz else1 then1: # I just need to return a value of 0 movl $0,%eax jmp end1 else1: jb else1_1 # C=0, which means *p1 < *p2 movl $-1,%eax jmp end1_1 else1_1: movl $1,%eax end1_1: end1: popl %ebx subl $n, %esp popl %ebp ret