OSDev.org

The Place to Start for Operating System Developers
 It is currently Sat Jun 19, 2021 12:32 pm

 All times are UTC - 6 hours

 Page 1 of 1 [ 8 posts ]
 Print view Previous topic | Next topic
Author Message
 Post subject: Masking an 32bits pointer to two 16 shorts issuePosted: Fri Jan 18, 2019 3:19 pm
 Member

Joined: Sun Oct 21, 2018 1:37 pm
Posts: 38
Hello cloud of wisdom,

I am trying to implement interrupt in my project, and while preparing the IDT entries, I am struggling to split the pointer to a function on two short.

This is the objdump with C:

And this is the C source:

What I do not understand is:

- It takes the value of the pointer (0x10670) and saves it in EAX. It takes AX to mask the first 16 bits (instead of doing the & AND) which will map to 0x7060 (little endian), this is fine, but for the high 16 bits it simple writes 0x0000 when I would expect 0x0100 (little endian), or even actually masking EAX with 0xFFFF0000 and then saving the value.

I assume I am doing something wrong, but I can't get my head around this after trying several things.

Any idea, suggestion or comment will be really appreciated!!
Thanks in advance.

Top

 Post subject: Re: Masking an 32bits pointer to two 16 shorts issuePosted: Fri Jan 18, 2019 3:32 pm
 Member

Joined: Mon Mar 25, 2013 7:01 pm
Posts: 3130
When you convert a 32-bit integer to a 16-bit integer, you throw away everything but the lowest 16 bits.

When you mask a 32-bit integer with 0xFFFF0000, the lowest 16 bits are always 0. GCC is clever and sees that those bits are always 0, so when you convert the result to a 16-bit integer, GCC skips the calculation and always uses 0.

Before we tell you the answer, see if you can figure out how to shift the bits you want into the lowest 16 bits.

Top

 Post subject: Re: Masking an 32bits pointer to two 16 shorts issuePosted: Fri Jan 18, 2019 4:49 pm
 Member

Joined: Sun Oct 21, 2018 1:37 pm
Posts: 38
oh.. I see it now. I need to shift 16 bits right and apply the same mask 0x0000FFFF. I need more practice masking hahaha it looked right in my head when I wrote it, but now I see how wrong it was.

Thanks octocontrabass!!

Top

 Post subject: Re: Masking an 32bits pointer to two 16 shorts issuePosted: Sun Jan 20, 2019 7:01 pm
 Member

Joined: Mon Jul 25, 2016 6:54 pm
Posts: 212
Location: Adelaide, Australia
mihe wrote:
oh.. I see it now. I need to shift 16 bits right and apply the same mask 0x0000FFFF. I need more practice masking hahaha it looked right in my head when I wrote it, but now I see how wrong it was.

Thanks octocontrabass!!

The inverse also works (apply mask 0xffff0000 then shift right (only when it's unsigned!)) sometimes this might suit better.

Top

 Post subject: Re: Masking an 32bits pointer to two 16 shorts issuePosted: Sun Jan 20, 2019 11:23 pm
 Member

Joined: Wed Aug 30, 2017 8:24 am
Posts: 1018
StudlyCaps wrote:
The inverse also works (apply mask 0xffff0000 then shift right (only when it's unsigned!)) sometimes this might suit better.

Why mask at all? If you definitely know the input is 32 bits, and is unsigned (which you definitely know for a uint32_t), then the shift removes all the bits you don't care about. And even if the result of the shift was larger than 16 bits, the assignment already masks out the low 16 bits. The only reason to add a mask under these circumstances is to shut up a compiler warning.

_________________
Thou hast outraged, not insulted me, sir; but for that I ask thee not to beware of Starbuck; thou wouldst but laugh; but let Ahab beware of Ahab; beware of thyself, old man.

Top

 Post subject: Re: Masking an 32bits pointer to two 16 shorts issuePosted: Mon Jan 21, 2019 12:15 am
 Member

Joined: Mon Jul 25, 2016 6:54 pm
Posts: 212
Location: Adelaide, Australia
nullplan wrote:
Why mask at all? If you definitely know the input is 32 bits, and is unsigned (which you definitely know for a uint32_t), then the shift removes all the bits you don't care about. And even if the result of the shift was larger than 16 bits, the assignment already masks out the low 16 bits. The only reason to add a mask under these circumstances is to shut up a compiler warning.

You're right, in all the cases mentioned ITT the masking is basically pointless because in C, integer type demotion always preserves the least significant bit pattern. It could be useful to add the mask just to implicitly indicate "yeah, I know I'm throwing away half the bits here", but it's basically unnecessary.

Top

 Post subject: Re: Masking an 32bits pointer to two 16 shorts issuePosted: Fri Feb 01, 2019 7:24 am

Joined: Thu Jan 31, 2019 4:33 am
Posts: 1
Can you explain a bit more in detail why exactly is that unnecessary please, StudlyCaps?

Top

 Post subject: Re: Masking an 32bits pointer to two 16 shorts issuePosted: Fri Feb 01, 2019 7:59 am

Joined: Mon Nov 26, 2018 9:14 am
Posts: 8
Paolini wrote:
Can you explain a bit more in detail why exactly is that unnecessary please, StudlyCaps?

I think he did: "...because in C, integer type demotion always preserves the least significant bit pattern..."

Top

 Display posts from previous: All posts1 day7 days2 weeks1 month3 months6 months1 year Sort by AuthorPost timeSubject AscendingDescending
 Page 1 of 1 [ 8 posts ]

 All times are UTC - 6 hours

Who is online

Users browsing this forum: No registered users and 3 guests

 You cannot post new topics in this forumYou cannot reply to topics in this forumYou cannot edit your posts in this forumYou cannot delete your posts in this forumYou cannot post attachments in this forum

Search for:
 Jump to:  Select a forum ------------------ Operating System Development    OS Development    OS Design & Theory    Announcements, Test Requests, & Job openings Everything Else    General Programming    General Ramblings    Auto-Delete Forum OSDev.org    OSDev Wiki    About this site
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group