Re: x86 assembly question

Manuel Bouyer <[email protected]> Tue, 9 Sep 2025 13:37:54 +0200
Newsgroups gmane.os.netbsd.ports.x86-64
Message-ID <[email protected]>
On Mon, Sep 08, 2025 at 10:38:13PM +0200, Manuel Bouyer wrote:
> Hello,
> I suspect that some assembly code is not doing what I think it should.
> But as it's in the early stage of boot it's hard to debug.
> 
> Here's the (32bits) code:
> 	push %ebx /* save start_info to stack */
> 	/* do stuff */
>         movl $RELOC(__kernel_end), %ebp
>         addl $3, %ebp
>         andl $~3, %ebp
>         movl 0(%ebp), %eax /* read size */
>         addl %ebp, %eax /* compute esym */
>         /* check if start_info is within symbol table */
>         movl -4(%esp), %ebx
>         cmp %ebx, %ebp;
>         jb .save_esym /* %ebx < __kernel_end */
>         cmp %ebx, %eax
>         jae .save_esym /* %ebx >= esym */
> 	/* no symbol table */

I had 2 issues there:
- the last pushed value is 0(%esp), not -4 because the stack grows down
  (thanks Joachim Kuebart for pointing this out)
- I got confused by cmp's argument order being the opposite between
  intel and gas syntax. As a result the "no symbol table" code was
  unreacheable.

-- 
Manuel Bouyer <[email protected]>
     NetBSD: 26 ans d'experience feront toujours la difference
--