试着理解一个代码在下面的网站是一个代码一个滚动与波浪一样的运动。总的来说,我也理解代码非常好。我不太明白的是,为什么他使用Ypos和Yposh的方式,他使用他们。那么,为什么位0 -2被掩盖与7和存储在Ypos?为什么值 然后右移3并存储在Yposh?
您可以在本网站上看到以下代码:https://codebase64.org/doku.php?id=magazines:chacking6#the_demo_cornerdycp_-_horizontal_scrolling
谢谢你的回答。
了解代码
1条答案
按热度按时间huus2vyu1#
我们的“现代”计算机系统是字节可寻址的,这意味着我们访问内存所能寻址的最小项是8位,并且每个连续的内存地址都拥有一个不同的8位字节。
当我们想要寻址大于或小于8位的内容时,我们必须做一些工作。
作为一个组合字节以形成大项目的示例,16位整数占用2个字节的内存,并且为了访问16位整数数组的元素,例如
a[i]
,我们必须执行地址运算,该地址运算将i
缩放整数的大小(以字节为单位),因此a+i*2
,因为每个2字节整数占用两个字节地址。(我们仅通过多字节项的一个地址(即最低/最小地址)来指代多字节项,但是由于多字节项采用多个字节地址,数组中的下一个多字节项需要跳过当前项的所有地址)。要寻址小于一个字节的内容,比如位图显示中的位,我们还需要做一些工作。首先,我们将发明位地址的概念。位地址是一个数字,代表内存的一个位。像字节地址和字节偏移量一样,位地址或位偏移量只是一个数字。和无符号整数。每个连续的位地址都指向内存的下一位。就像字节地址和字节偏移量一样,我们可以在位地址和位偏移量上进行算术运算、索引计算等等,例如用于二维显示。
当然,硬件不支持位寻址,只支持字节寻址,因此要读取单个位,我们需要读取包含该位的整个字节;要写入单个位,我们需要写入包含该位的整个字节。
(写操作稍微复杂一些,因为通常我们在写单个位时不想干扰附近的其他位,所以写单个位在逻辑上实际上是读字节(包含感兴趣的位),修改该字节,然后再写回去。我们如何完成读-修改-写操作取决于CPU的指令集。)
位地址或位偏移量与字节地址或字节偏移量相差8倍(因为字节包含8位)!因此,包含给定字节地址的位的字节具有位地址除以8的地址,并且,给定一个字节,该字节内的位数是位地址模数8,从0到7的数。
除以8和除以8求模对于二进制硬件来说很容易做到:除以8是右移3比特位置,例如在C中为
b >> 3
,并且除以8取模是仅保留低3比特的掩码,例如在C中为b & 7
。