为什么总是想睡觉| 痛风看什么科| 肠道菌群失调有什么症状| 低脂高钙牛奶适合什么人群| 英国的全称是什么| 80年出生属什么生肖| 夏季吃什么菜好| 结肠炎吃什么药好| 为什么突然就得肝炎了| 女人眉心有痣代表什么| 进击的巨人真相是什么| 气血不足吃什么中成药| 2002年出生属什么| 能吃是福是什么意思| 极乐是什么意思| 氨糖是什么| 孺子可教什么意思| 瓜子脸适合什么刘海| btob是什么意思| 肾结石术后吃什么食物最好| 腹腔气体多是什么原因| 什么是尿毒症啊| 鸢是什么意思| 甲亢是什么引起的| 阿司匹林治疗什么病| 心慌是什么病| 嵌顿是什么意思| 调御丈夫是什么意思| 利尿吃什么药| 藏青色是什么颜色| 热痱子是什么原因引起的| prr是什么意思| 小娘皮什么意思| 血虚吃什么中成药最好| 骨髓炎是什么病| 用盐水洗脸有什么好处和坏处| 痔疮可以吃什么| 中元节又叫什么节| 尿胆红素高是什么原因| 丝袜是什么材质| 卒中是什么意思| 晨尿茶色是什么原因| 高血压二级是什么意思| 养兰花用什么土最好| 右眼跳是什么预兆| 牛油果和什么榨汁好喝| 梦见死鸡是什么预兆| 坐位体前屈是什么意思| 刮宫是什么| 什么样的春天| 啫喱是什么| 大肠在人体什么位置图| 足跟痛用什么药| 上梁是什么意思| 乙肝e抗体阴性是什么意思| 梦见自己的手机丢了是什么意思| 红加黄等于什么颜色| 马拉车是什么牌子的包| 宫颈是什么| 连襟是什么意思| 烟酰胺是什么东西| 为什么半夜流鼻血| 长疮是什么原因| 面筋是什么做的| 安眠药有什么副作用| 郭麒麟什么学历| 牙龈出血用什么药| 肚子胀气是什么原因| 副巡视员是什么级别| 眼睛粘糊是什么原因| 大便次数多吃什么药| hpv是什么症状| 团委书记是什么级别| 黑下打信是什么任务| 谢娜什么星座| lady是什么意思| 林檎是什么意思| 试纸一条红杠是什么意思| 什么办法退烧快| 红细胞分布宽度偏高是什么意思| 皮肤脱皮是什么原因| 男人胡子长得快是什么原因| 龙抄手是什么| 三个代表是什么| 空调吹感冒吃什么药| 小便发红是什么症状男| 树叶为什么是绿色的| 提心吊胆是什么意思| 倒斗是什么意思| 书到用时方恨少下一句是什么| 肝火旺失眠吃什么药| pose什么意思| 血蛋白低会有什么影响| 吾矛之利的利什么意思| 38是什么生肖| 宫外孕是什么| 擦汗表情是什么意思| 步后尘是什么意思| 纹身有什么危害| 举案齐眉是什么意思| mr是什么| 女人太瘦吃什么增肥| 黄芪配升麻有什么作用| icu什么意思| 甘油三酯高是什么原因造成的| 锰酸钾是什么颜色| 表挂在客厅什么位置好| 小丑叫什么| 砷对人体有什么危害| 皮肤癣用什么药最好| 水痘可以吃什么水果| 牛油果是什么季节的水果| 改姓需要什么手续| 韩语欧巴是什么意思| 腋下大量出汗是什么原因| jumper是什么衣服| 什么是红眼病| 高血压突然变成低血压是什么原因| 金银花有什么功效和作用| 手心朝上是什么意思| 牛油果什么味道| 吃完虾不能吃什么水果| 胸疼挂什么科| 忧思是什么意思| nas是什么| 拔罐紫色说明什么| 有里面没有两横是什么字| 怀孕之后身体有什么变化| 内科查什么| 水解奶粉是什么意思| 提高免疫力吃什么食物| 浑身发抖是什么原因| 有什么方法可以快速入睡| 新生婴儿吃什么奶粉| 姝字五行属什么| 白茶什么季节喝好| 杂合变异是什么意思| 寒露是什么意思| 槟榔什么味道| 大同有什么好玩的| 做梦翻车了什么预兆| 肠胃感冒吃什么| 脸色暗沉发黑是什么原因| 正骨是什么意思| 环比是什么| 50pcs是什么意思| 为什么不| 小孩为什么会流鼻血| 蒙奇奇是什么动物| 绿色的鸟是什么鸟| 打猎是什么意思| 坐北朝南是什么意思| 猪蹄和什么一起炖好吃| 双卵巢是什么意思| white是什么意思颜色| 肽是什么东西| 白藜芦醇是什么东西| 陈惠敏和陈慧琳什么关系| 胰腺疼痛吃什么药| nasa是什么牌子| 6月4号是什么星座| 黑色的蜂是什么蜂| 门当是什么| 低血糖中医叫什么病| sjb什么意思| 头孢吃多了有什么副作用| 阴阳二气是什么意思| 炖鸡汤用什么鸡| 什么是空调病| 宠溺是什么意思| 叫人挪车打什么电话| 口若什么什么| 什么情况下需要根管治疗| qd是什么意思| 盆腔积液是什么| 碍事是什么意思| 儿童中耳炎用什么药最好| 男人身体怕冷是什么原因如何调理| 便秘是什么症状| 僵尸为什么怕糯米| 小孩过敏性咳嗽吃什么药| 黄金果是什么水果| 龙凤呈祥是什么生肖| 妮字五行属什么| 梦见晒衣服是什么意思| 正月初一是什么生肖| 金国人是现在的什么人| 女人为什么要穿高跟鞋| 农历正月初一是什么节日| 铅中毒什么症状| bac是什么意思| 什么食物| 体育精神是什么| 前位子宫是什么意思| 护士最高职称是什么| 为什么会心肌梗死| 福州有什么好玩的地方| 狗狗拉血是什么原因| 波霸是什么| 回潮是什么意思| youtube是什么软件| 小case是什么意思| 非萎缩性胃炎吃什么药| 肋间神经痛用什么药| 眼睛视力模糊是什么原因| 三七甘一是什么意思| 载歌载舞的载是什么意思| 色是什么结构| 华西医院院长什么级别| 辟谷吃什么| 阿胶补血口服液适合什么人喝| 策反是什么意思| 舒张压偏高是什么原因| 葫芦什么时候成熟| 切忌是什么意思| 喉咙干咳吃什么药| 艾滋病通过什么传播| 女性性冷淡是什么原因| 大姨妈来吃什么水果好| 黄芪泡水喝有什么作用| 芭乐是什么| 人为什么会近视| 什么是ntr| 煮方便面什么时候放鸡蛋| 什么的叶丛| 吹水是什么意思| 心肌缺血吃什么补得快| 加湿器有什么作用| 粉荷花的花语是什么| 共济失调是什么病| 胆囊炎吃什么药效果最好| 狗的本命佛是什么佛| 紫菜不能和什么一起吃| 白矾和明矾有什么区别| 宜祭祀是什么意思| 青光眼是什么| 雷尼替丁主要治什么胃病| 夹页念什么| 如果你是什么那快乐就是什么| 复光是什么意思| 世界上牙齿最多的动物是什么| 鹅蛋孕妇吃有什么好处| 子宫为什么会长息肉| 香港迪士尼什么时候开业的| 十月一日是什么节| 舌苔白厚是什么原因| 抻是什么意思| 容易淤青是什么原因| 经常早上肚子疼是什么原因| 尿蛋白十一什么意思| 尿频尿急吃什么药| 日照香炉生紫烟是什么意思| 250为什么是骂人的话| 男人补锌有什么好处| 什么繁什么茂| 保育是什么意思| tct什么意思| 梦到吃饭是什么意思| 摩羯后面是什么星座| 酒精是什么| 脚底起泡是什么原因| 隐形眼镜什么牌子好| 藕粉色是什么颜色| 腺样体是什么意思| 百度Jump to content

周恩来:一个光荣而不朽的名字-人物史事-时政频道-中工网

From Wikipedia, the free encyclopedia
(Redirected from Data alignment)
百度 最终,北京中赫国安2-1战胜北京北控。

Data structure alignment is the way data is arranged and accessed in computer memory. It consists of three separate but related issues: data alignment, data structure padding, and packing.

The CPU in modern computer hardware performs reads and writes to memory most efficiently when the data is naturally aligned, which generally means that the data's memory address is a multiple of the data size. For instance, in a 32-bit architecture, the data may be aligned if the data is stored in four consecutive bytes and the first byte lies on a 4-byte boundary.

Data alignment is the aligning of elements according to their natural alignment. To ensure natural alignment, it may be necessary to insert some padding between structure elements or after the last element of a structure. For example, on a 32-bit machine, a data structure containing a 16-bit value followed by a 32-bit value could have 16 bits of padding between the 16-bit value and the 32-bit value to align the 32-bit value on a 32-bit boundary. Alternatively, one can pack the structure, omitting the padding, which may lead to slower access, but uses three quarters as much memory[citation needed].

Although data structure alignment is a fundamental issue for all modern computers, many computer languages and computer language implementations handle data alignment automatically. Fortran, Ada,[1][2] PL/I,[3] Pascal,[4] certain C and C++ implementations, D,[5] Rust,[6] C#,[7] and assembly language allow at least partial control of data structure padding, which may be useful in certain special circumstances.

Definitions

[edit]

A memory address a is said to be n-byte aligned when a is a multiple of n (where n is a power of 2). In this context, a byte is the smallest unit of memory access, i.e. each memory address specifies a different byte. An n-byte aligned address would have a minimum of log2(n) least-significant zeros when expressed in binary.

The alternate wording b-bit aligned designates a b/8 byte aligned address (ex. 64-bit aligned is 8 bytes aligned).

A memory access is said to be aligned when the data being accessed is n bytes long and the datum address is n-byte aligned. When a memory access is not aligned, it is said to be misaligned. Note that by definition byte memory accesses are always aligned.

A memory pointer that refers to primitive data that is n bytes long is said to be aligned if it is only allowed to contain addresses that are n-byte aligned, otherwise it is said to be unaligned. A memory pointer that refers to a data aggregate (a data structure or array) is aligned if (and only if) each primitive datum in the aggregate is aligned.

Note that the definitions above assume that each primitive datum is a power of two bytes long. When this is not the case (as with 80-bit floating-point on x86) the context influences the conditions where the datum is considered aligned or not.

Data structures can be stored in memory on the stack with a static size known as bounded or on the heap with a dynamic size known as unbounded.

Problems

[edit]

The CPU accesses memory by a single memory word at a time. As long as the memory word size is at least as large as the largest primitive data type supported by the computer, aligned accesses will always access a single memory word. This may not be true for misaligned data accesses.

If the highest and lowest bytes in a datum are not within the same memory word, the computer must split the datum access into multiple memory accesses. This requires a lot of complex circuitry to generate the memory accesses and coordinate them. To handle the case where the memory words are in different memory pages the processor must either verify that both pages are present before executing the instruction or be able to handle a TLB miss or a page fault on any memory access during the instruction execution.

Some processor designs deliberately avoid introducing such complexity, and instead yield alternative behavior in the event of a misaligned memory access. For example, implementations of the ARM architecture prior to the ARMv6 ISA require mandatory aligned memory access for all multi-byte load and store instructions.[8] Depending on which specific instruction was issued, the result of attempted misaligned access might be to round down the least significant bits of the offending address turning it into an aligned access (sometimes with additional caveats), or to throw an MMU exception (if MMU hardware is present), or to silently yield other potentially unpredictable results. The ARMv6 and later architectures support unaligned access in many circumstances, but not necessarily all.

When a single memory word is accessed the operation is atomic, i.e. the whole memory word is read or written at once and other devices must wait until the read or write operation completes before they can access it. This may not be true for unaligned accesses to multiple memory words, e.g. the first word might be read by one device, both words written by another device and then the second word read by the first device so that the value read is neither the original value nor the updated value. Although such failures are rare, they can be very difficult to identify.

Data structure padding

[edit]

Although the compiler (or interpreter) normally allocates individual data items on aligned boundaries, data structures often have members with different alignment requirements. To maintain proper alignment the translator normally inserts additional unnamed data members so that each member is properly aligned. In addition, the data structure as a whole may be padded with a final unnamed member. This allows each member of an array of structures to be properly aligned.

Padding is only inserted when a structure member is followed by a member with a larger alignment requirement or at the end of the structure. By changing the ordering of members in a structure, it is possible to change the amount of padding required to maintain alignment. For example, if members are sorted by descending alignment requirements a minimal amount of padding is required. The minimal amount of padding required is always less than the largest alignment in the structure. Computing the maximum amount of padding required is more complicated, but is always less than the sum of the alignment requirements for all members minus twice the sum of the alignment requirements for the least aligned half of the structure members.

Although C and C++ do not allow the compiler to reorder structure members to save space, other languages might. It is also possible to tell most C and C++ compilers to "pack" the members of a structure to a certain level of alignment, e.g. "pack(2)" means align data members larger than a byte to a two-byte boundary so that any padding members are at most one byte long. Likewise, in PL/I a structure may be declared UNALIGNED to eliminate all padding except around bit strings.

One use for such "packed" structures is to conserve memory. For example, a structure containing a single byte (such as a char) and a four-byte integer (such as uint32_t) would require three additional bytes of padding. A large array of such structures would use 37.5% less memory if they are packed, although accessing each structure might take longer. This compromise may be considered a form of space–time tradeoff.

Although use of "packed" structures is most frequently used to conserve memory space, it may also be used to format a data structure for transmission using a standard protocol. However, in this usage, care must also be taken to ensure that the values of the struct members are stored with the endianness required by the protocol (often network byte order), which may be different from the endianness used natively by the host machine.

Computing padding

[edit]

The following formulas provide the number of padding bytes required to align the start of a data structure (where mod is the modulo operator):

padding = (align - (offset mod align)) mod align
aligned = offset + padding
        = offset + ((align - (offset mod align)) mod align)

For example, the padding to add to offset 0x59d for a 4-byte aligned structure is 3. The structure will then start at 0x5a0, which is a multiple of 4. However, when the alignment of offset is already equal to that of align, the second modulo in (align - (offset mod align)) mod align will return zero, therefore the original value is left unchanged.

Since the alignment is by definition a power of two,[a] the modulo operation can be reduced to a bitwise AND operation.

The following formulas produce the correct values (where & is a bitwise AND and ~ is a bitwise NOT) – providing the offset is unsigned or the system uses two's complement arithmetic:

padding = (align - (offset & (align - 1))) & (align - 1)
        = -offset & (align - 1)
aligned = (offset + (align - 1)) & ~(align - 1)
        = (offset + (align - 1)) & -align

Typical alignment of C structs on x86

[edit]

Data structure members are stored sequentially in memory so that, in the structure below, the member Data1 will always precede Data2; and Data2 will always precede Data3:

struct MyData
{
    short Data1;
    short Data2;
    short Data3;
};

If the type "short" is stored in two bytes of memory then each member of the data structure depicted above would be 2-byte aligned. Data1 would be at offset 0, Data2 at offset 2, and Data3 at offset 4. The size of this structure would be 6 bytes.

The type of each member of the structure usually has a default alignment, meaning that it will, unless otherwise requested by the programmer, be aligned on a pre-determined boundary. The following typical alignments are valid for compilers from Microsoft (Visual C++), Borland/CodeGear (C++Builder), Digital Mars (DMC), and GNU (GCC) when compiling for 32-bit x86:

  • A char (one byte) will be 1-byte aligned.
  • A short (two bytes) will be 2-byte aligned.
  • An int (four bytes) will be 4-byte aligned.
  • A long (four bytes) will be 4-byte aligned.
  • A float (four bytes) will be 4-byte aligned.
  • A double (eight bytes) will be 8-byte aligned on Windows and 4-byte aligned on Linux (8-byte with -malign-double compile time option).
  • A long long (eight bytes) will be 8-byte aligned on Windows and 4-byte aligned on Linux (8-byte with -malign-double compile time option).
  • A long double (ten bytes with C++Builder and DMC, eight bytes with Visual C++, twelve bytes with GCC) will be 8-byte aligned with C++Builder, 2-byte aligned with DMC, 8-byte aligned with Visual C++, and 4-byte aligned with GCC.
  • Any pointer (four bytes) will be 4-byte aligned. (e.g.: char*, int*)

The only notable differences in alignment for an LP64 64-bit system when compared to a 32-bit system are:

  • A long (eight bytes) will be 8-byte aligned.
  • A double (eight bytes) will be 8-byte aligned.
  • A long long (eight bytes) will be 8-byte aligned.
  • A long double (eight bytes with Visual C++, sixteen bytes with GCC) will be 8-byte aligned with Visual C++ and 16-byte aligned with GCC.
  • Any pointer (eight bytes) will be 8-byte aligned.

Some data types are dependent on the implementation.

Here is a structure with members of various types, totaling 8 bytes before compilation:

struct MixedData
{
    char Data1;
    short Data2;
    int Data3;
    char Data4;
};

After compilation the data structure will be supplemented with padding bytes to ensure a proper alignment for each of its members:

struct MixedData  /* After compilation in 32-bit x86 machine */
{
    char Data1; /* 1 byte */
    char Padding1[1]; /* 1 byte for the following 'short' to be aligned on a 2-byte boundary
assuming that the address where structure begins is an even number */
    short Data2; /* 2 bytes */
    int Data3;  /* 4 bytes - largest structure member */
    char Data4; /* 1 byte */
    char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */
};

The compiled size of the structure is now 12 bytes.

The last member is padded with the number of bytes required so that the total size of the structure should be a multiple of the largest alignment of any structure member (alignof(int) in this case, which = 4 on linux-32bit/gcc)[citation needed].

In this case 3 bytes are added to the last member to pad the structure to the size of 12 bytes (alignof(int) * 3).

struct FinalPad {
  float x;
  char n[1];
};

In this example the total size of the structure sizeof(FinalPad) == 8, not 5 (so that the size is a multiple of 4 (alignof(float))).

struct FinalPadShort {
  short s;
  char n[3];
};

In this example the total size of the structure sizeof(FinalPadShort) == 6, not 5 (not 8 either) (so that the size is a multiple of 2 (alignof(short) == 2 on linux-32bit/gcc)).

It is possible to change the alignment of structures to reduce the memory they require (or to conform to an existing format) by reordering structure members or changing the compiler's alignment (or “packing”) of structure members.

struct MixedData  /* after reordering */
{
    char Data1;
    char Data4;   /* reordered */
    short Data2;
    int Data3;
};

The compiled size of the structure now matches the pre-compiled size of 8 bytes. Note that Padding1[1] has been replaced (and thus eliminated) by Data4 and Padding2[3] is no longer necessary as the structure is already aligned to the size of a long word.

The alternative method of enforcing the MixedData structure to be aligned to a one byte boundary will cause the pre-processor to discard the pre-determined alignment of the structure members and thus no padding bytes would be inserted.

While there is no standard way of defining the alignment of structure members (while C and C++ allow using the alignas specifier for this purpose it can be used only for specifying a stricter alignment), some compilers use #pragma directives to specify packing inside source files. Here is an example:

#pragma pack(push)  /* push current alignment to stack */
#pragma pack(1)     /* set alignment to 1-byte boundary */

struct MyPackedData
{
    char Data1;
    long Data2;
    char Data3;
};

#pragma pack(pop)   /* restore original alignment from stack */

This structure would have a compiled size of 6 bytes on a 32-bit system. The above directives are available in compilers from Microsoft,[9] Borland, GNU,[10] and many others.

Another example:

struct MyPackedData
{
    char Data1;
    long Data2;
    char Data3;
} __attribute__((packed));

Default packing and #pragma pack

[edit]

On some Microsoft compilers, particularly for RISC processors, there is an unexpected relationship between project default packing (the /Zp directive) and the #pragma pack directive. The #pragma pack directive can only be used to reduce the packing size of a structure from the project default packing.[11] This leads to interoperability problems with library headers which use, for example, #pragma pack(8), if the project packing is smaller than this. For this reason, setting the project packing to any value other than the default of 8 bytes would break the #pragma pack directives used in library headers and result in binary incompatibilities between structures. This limitation is not present when compiling for x86.

Allocating memory aligned to cache lines

[edit]

It would be beneficial to allocate memory aligned to cache lines. If an array is partitioned for more than one thread to operate on, having the sub-array boundaries unaligned to cache lines could lead to performance degradation. Here is an example to allocate memory (double array of size 10) aligned to cache of 64 bytes.

#include <stdlib.h>
double *foo(void) { //create array of size 10
   double *array;
   if (0 == posix_memalign((void**)&array, 64, 10*sizeof(double)))
     return array;

   return NULL;
}

Hardware significance of alignment requirements

[edit]

Alignment concerns can affect areas much larger than a C structure when the purpose is the efficient mapping of that area through a hardware address translation mechanism (PCI remapping, operation of a MMU).

For instance, on a 32-bit operating system, a 4 KiB (4096 bytes) page is not just an arbitrary 4 KiB chunk of data. Instead, it is usually a region of memory that's aligned on a 4 KiB boundary. This is because aligning a page on a page-sized boundary lets the hardware map a virtual address to a physical address by substituting the higher bits in the address, rather than doing complex arithmetic.

Example: Assume that we have a TLB mapping of virtual address 0x2CFC7000 to physical address 0x12345000. (Note that both these addresses are aligned at 4 KiB boundaries.) Accessing data located at virtual address va=0x2CFC7ABC causes a TLB resolution of 0x2CFC7 to 0x12345 to issue a physical access to pa=0x12345ABC. Here, the 20/12-bit split luckily matches the hexadecimal representation split at 5/3 digits. The hardware can implement this translation by simply combining the first 20 bits of the physical address (0x12345) and the last 12 bits of the virtual address (0xABC). This is also referred to as virtually indexed (ABC) physically tagged (12345).

A block of data of size 2(n+1) ? 1 always has one sub-block of size 2n aligned on 2n bytes.

This is how a dynamic allocator that has no knowledge of alignment, can be used to provide aligned buffers, at the price of a factor two in space loss.

// Example: get 4096 bytes aligned on a 4096-byte buffer with malloc()

// unaligned pointer to large area
void *up = malloc((1 << 13) - 1);
// well-aligned pointer to 4 KiB
void *ap = aligntonext(up, 12);

where aligntonext(p, r) works by adding an aligned increment, then clearing the r least significant bits of p. A possible implementation is

// Assume `uint32_t p, bits;` for readability
#define alignto(p, bits)      (((p) >> bits) << bits)
#define aligntonext(p, bits)  alignto(((p) + (1 << bits) - 1), bits)

Notes

[edit]
  1. ^ On modern computers where the target alignment is a power of two. This might not be true, for example, on a system using 9-bit bytes or 60-bit words.

References

[edit]
  1. ^ "Ada Representation Clauses and Pragmas". GNAT Reference Manual 7.4.0w documentation. Retrieved 2025-08-06.
  2. ^ "F.8 Representation Clauses". SPARCompiler Ada Programmer's Guide (PDF). Retrieved 2025-08-06.
  3. ^ IBM System/360 Operating System PL/I Language Specifications (PDF). IBM. July 1966. pp. 55–56. C28-6571-3.
  4. ^ Niklaus Wirth (July 1973). "The Programming Language Pascal (Revised Report)" (PDF). p. 12.
  5. ^ "Attributes – D Programming Language: Align Attribute". Retrieved 2025-08-06.
  6. ^ "The Rustonomicon – Alternative Representations". Retrieved 2025-08-06.
  7. ^ "LayoutKind Enum (System.Runtime.InteropServices)". docs.microsoft.com. Retrieved 2025-08-06.
  8. ^ Kurusa, Levente (2025-08-06). "The curious case of unaligned access on ARM". Medium. Retrieved 2025-08-06.
  9. ^ pack
  10. ^ 6.58.8 Structure-Packing Pragmas
  11. ^ "Working with Packing Structures". MSDN Library. Microsoft. 2025-08-06. Retrieved 2025-08-06.

Further reading

[edit]
  • Bryant, Randal E.; David, O'Hallaron (2003). Computer Systems: A Programmer's Perspective (2003 ed.). Upper Saddle River, New Jersey, USA: Pearson Education. ISBN 0-13-034074-X.
  • "1. Introduction: Segment Alignment". 8086 Family Utilities – User's Guide for 8080/8085-Based Development Systems (PDF). Revision E (A620/5821 6K DD ed.). Santa Clara, California, USA: Intel Corporation. May 1982 [1980, 1978]. pp. 1-6, 3-5. Order Number: 9800639-04. Archived (PDF) from the original on 2025-08-06. Retrieved 2025-08-06. […] A segment can have one (and in the case of the inpage attribute, two) of five alignment attributes: […] Byte, which means a segment can be located at any address. […] Word, which means a segment can only be located at an address that is a multiple of two, starting from address 0H. […] Paragraph, which means a segment can only be located at an address that is a multiple of 16, starting from address 0. […] Page, which means a segment can only be located at an address that is a multiple of 256, starting from address 0. […] Inpage, which means a segment can be located at whichever of the preceding attributes apply plus must be located so that it does not cross a page boundary […] The alignment codes are: […] B – byte […] W – word […] G – paragraph […] xR – inpage […] P – page […] A – absolute […] the x in the inpage alignment code can be any other alignment code. […] a segment can have the inpage attribute, meaning it must reside within a 256 byte page and can have the word attribute, meaning it must reside on an even numbered byte. […]
[edit]
下午两点属于什么时辰 腰椎退变是什么意思 cpp是什么 从革是什么意思 plus什么意思
什么叫因果 什么喷剂延时最好 注意是什么意思 越南说什么语言 男人吃洋葱有什么好处
自变量是什么 乐福鞋是什么鞋 女性排卵有什么症状或感觉 家族史是什么意思 阴虚内热吃什么药好
梦见鬼是什么预兆 洗钱是什么意思啊 咏字五行属什么 舌头白色是什么原因 april是什么意思
存在是什么hcv9jop4ns7r.cn 右眼睛跳是什么预兆hcv9jop7ns0r.cn 魔鬼城是什么地貌hcv8jop2ns3r.cn http什么意思hcv9jop7ns9r.cn 什么是公历年份hcv8jop3ns0r.cn
婚检查什么hcv9jop1ns9r.cn 蹼是什么意思hcv8jop1ns5r.cn 四个口是什么字hcv8jop1ns7r.cn may是什么意思hcv8jop7ns7r.cn 鬼是什么意思hcv7jop5ns1r.cn
脾囊肿是什么原因引起的hcv8jop9ns8r.cn 多宝鱼是什么鱼hcv9jop6ns2r.cn 稽留流产什么意思hcv9jop3ns7r.cn 腿脚酸软无力是什么原因hcv8jop3ns1r.cn 尿蛋白高不能吃什么食物hcv9jop2ns6r.cn
三价铁离子什么颜色yanzhenzixun.com 淡泊名利是什么意思hcv7jop7ns2r.cn 脚气泡脚用什么泡最好bjhyzcsm.com 四个月读什么hcv8jop5ns7r.cn 0x00000024蓝屏代码是什么意思hcv8jop0ns1r.cn
百度