Intel 80386程序员参考:操作数选择与内存管理

需积分: 50 22 下载量 91 浏览量 更新于2024-08-07 收藏 2.58MB PDF 举报
"cjc8988_datasheet_v3.0声卡驱动手册" 本文档是关于Intel 80386处理器的程序员参考手册,涵盖了编程模型、内存管理和多任务处理等多个方面,旨在帮助开发者理解如何有效地利用80386处理器进行程序设计。以下是对关键知识点的详细说明: 1. **操作数选择**: 在2.5章节中,操作数选择是汇编语言编程中的重要概念。80386支持多种操作数类型,包括立即数、寄存器、内存位置和寄存器间接等。开发者需要根据指令的需求和效率考虑选择哪种类型的操作数。例如,立即数用于直接编码常数值,寄存器操作数速度快但数量有限,而内存操作数则适用于处理大容量数据。 2. **编程基本模型**: 第二章介绍了80386的编程环境,包括存储器组织和段(2.1)、数据类型(2.2)、寄存器(2.3)以及指令格式(2.4)。80386使用段和偏移地址模式来访问内存,数据类型包括字节、字、双字等,寄存器分为数据、指针、控制和调试寄存器,每种都有特定的用途。 3. **系统寄存器和系统指令**: 第四章详细讨论了4.1系统寄存器,如CS、DS、ES、FS、GS等段寄存器,以及EAX、EBX等数据寄存器。4.2系统指令部分,介绍了如CLI、STI(关闭、打开中断)等控制处理器状态的指令。 4. **内存管理**: 分段地址转换(5.1)和分页地址转换(5.2)是80386实现内存管理的关键技术。5.3章节的混合分段和分页地址转换结合了两种方法,以提供更灵活的内存管理和访问权限控制。 5. **保护机制**: 第六章阐述了80386的保护机制,6.1章节解释了为何需要保护,主要是为了防止非法访问和数据破坏。6.2至6.5章节分别介绍了段级和页级的保护策略,以及如何将它们结合使用以实现全面的内存保护。 6. **多任务处理**: 第七章介绍了80386在多任务环境下的工作方式,如7.1的任务状态段、7.3的任务寄存器、7.4的任务门描述符和7.5的任务切换。7.6的任务链和7.7的任务寻址空间则是多任务环境下任务间通信和调度的重要概念。 7. **输入输出**: 第八章8.1和8.2部分讲述了80386的I/O指令以及如何在保护模式下进行I/O操作。8.3章节讨论了I/O保护,确保在多任务环境中安全地进行设备交互。 8. **异常和中断**: 异常和中断(9.1-9.6)是处理器响应错误或外部事件的方式。这部分内容详细解释了异常的分类、处理流程以及中断向量表。 9. **其他高级特性**: 最后,文档可能还涵盖了其他高级特性,如9.1-9.6章节所示,这些可能涉及更复杂的处理器功能和系统配置。 Intel 80386程序员参考手册是深入理解80386处理器和编写高效汇编代码的基础。通过理解这些知识点,开发者能够更好地利用处理器资源,优化程序性能,并构建出安全可靠的系统。

int main(int argc, char *argv[]) { ec_param *ecp; sm2_ec_key *key_B; message_st message_data; int type = TYPE_GFp; int point_bit_length = 256; char **sm2_param = sm2_param_recommand; ecp = ec_param_new(); ec_param_init(ecp, sm2_param, type, point_bit_length); key_B = sm2_ec_key_new(ecp); sm2_ec_key_init(key_B, sm2_param_d_B[ecp->type], ecp); memset(&message_data, 0, sizeof(message_data)); sm2_hex2bin((BYTE *)sm2_param_k[ecp->type], message_data.k, ecp->point_byte_length); sm2_bn2bin(key_B->d, message_data.private_key, ecp->point_byte_length); sm2_bn2bin(key_B->P->x, message_data.public_key.x, ecp->point_byte_length); sm2_bn2bin(key_B->P->y, message_data.public_key.y, ecp->point_byte_length); message_data.decrypt = (BYTE *)OPENSSL_malloc(message_data.message_byte_length + 1); memset(message_data.decrypt, 0, message_data.message_byte_length + 1); BIGNUM *P_x; BIGNUM *P_y; //BIGNUM *d; BIGNUM *k; xy_ecpoint *P; xy_ecpoint *xy1; xy_ecpoint *xy2; int pos1; BYTE t; int i; sm2_hash local_C_3; P_x = BN_new(); P_y = BN_new(); k = BN_new(); P = xy_ecpoint_new(ecp); xy1 = xy_ecpoint_new(ecp); xy2 = xy_ecpoint_new(ecp); BN_bin2bn(message_data.public_key.x, ecp->point_byte_length, P_x); BN_bin2bn(message_data.public_key.y, ecp->point_byte_length, P_y); BN_bin2bn(message_data.k, ecp->point_byte_length, k); xy_ecpoint_init_xy(P, P_x, P_y, ecp); xy_ecpoint_mul_bignum(xy1, ecp->G, k, ecp); xy_ecpoint_mul_bignum(xy2, P, k, ecp); char cryptstring[1024]; scanf("%s", cryptstring); / 利用函数sm2_hex2bin将16进制字符串cryptstring转换成二进制流填充到message_data.C里 / / 计算明文长度 message_data.message_byte_length */ message_data.klen_bit = message_data.message_byte_length * 8;(请根据注释补充)

2023-05-26 上传