Using INT 10h ah13h 详解

本文详细介绍了BIOS INT10h中的AH=13h功能,即如何将ASCII字符串写入显示器,包括调用寄存器的具体设置、串写模式的选择及注意事项。此功能适用于标识屏幕上的文本,并可用于PCXT和个人计算机AT及其后续机型。

在自己动手写操作系统中用到了bios int 10h中的ah13功能.这里特意把具体的细节写出来:

INT 10h / AH = 13h - write string.
input:
AL = write mode:
bit 0: update cursor after writing;
bit 1: string contains attributes.
BH = page number.
BL = attribute if string contains only characters (bit 1 of AL is zero).
CX = number of characters in string (attributes are not counted).
DL,DH = column, row at which to start writing.
ES:BP points to string to be printed.
-----------------------------------------------------
Bit color table:
Character attribute is 8 bit value, low 4 bits set foreground color, high 4 bits set background color. Background blinking not supported.
HEX BIN COLOR
0 0000 black
1 0001 blue
2 0010 green
3 0011 cyan
4 0100 red
5 0101 magenta
6 0110 brown
7 0111 light gray
8 1000 dark gray
9 1001 light blue
A 1010 light green
B 1011 light cyan
C 1100 light red
D 1101 light magenta
E 1110 yellow
F 1111 white

中文版内容:

Int 10h 功能13h 〈AT〉
写入串
399页
把ASCII串写到显示器上。
调用寄存器: AH 13h
AL 写入模式(参见表15.9)
BH 视频页
BL 属性(写入模式0和1)
CX 串长度
DH 串写入的行
DL 串写入的列
ES:BP 指向串的指针
返回寄存器:无
表15.9写串的模式
模式 注 释
0 BL中的属性。串只能是字符。未更新光标。
1 BL中的属性。串只能是字符。已更新光标。
2 串可采用字符或属性。未更新光标。
3 串可采用字符或属性。已更新光标。
注释:仅仅在BiOS日期为1/10/86或以后的PC XT Personal Computer AT
以及PS/2系列的机器上该功能才可用,其作用就是把字符串写到当前活动
的显示页上。
可用该功能来标识某个串(通过字符的嵌入或全局属性来标识),并接着
把它写给屏幕。由于该功能依靠其它的BIOS功能来写入串,因而其速度不是
很快。
功能13h是用电传式中断(Teletype interrupt)(Int 10h,功能0Eh)来进行
输出的,这就决定了它通过把光标回移一个位置、拉响控制台报警器、下移一
行或把光标移至当前行的开头的方式来分别响应退格(ASCII 08h)、响铃
(ASCII 07h)、换行(ASCII 0Ah)以及回车(ASCII 0Dh)等字符。它还能实现显
示行的下滚和上滚。

参考资料:

DOS程序员参考手册(BIOS参考手册) http://alexluo.blog.hexun.com/7975614_d.html

INT 10h Using http://www.cnblogs.com/BpLoveGcy/archive/2006/11/21/567976.html


请仔细阅读和分析下面函数,进行优化后,采用C/C++11标准,完整推导并重构可编译的全部代码 特别注意: 1.保持所有原始功能不变 2.提高执行效率,降低计算复杂度 3.已经给定的结构体名字和元素不要更改,详细的中文注释 4.自动添加中文注释说明功能逻辑 5.不使用 auto,使用显式 for 循环 6.结构体采用32位定义 7.不要使用小函数,保持原始的函数定义 8.严格保持protobuf字段映射关系 函数中的 HDDMXng::TileType::TileType 映射为 message TileType { optional uint32 numarcs = 1; optional uint32 gidx = 2; optional uint32 numwires = 3; optional sint32 xmin = 4; optional sint32 xmax = 5; optional sint32 ymin = 6; optional sint32 ymax = 7; optional uint32 xgridextent = 8; optional uint32 ygridextent = 9; optional string gname = 10; optional string hwname = 11; repeated SiteChildDef sitechilddefs = 12; repeated sint32 sitepin2wire = 13 [packed = true]; optional uint32 numtileports = 14; } 将 _BYTE tileType_msg[16] 映射为 HDDMXng::TileType tileType_msg; void __fastcall HDDMTileType::readme_pb( HDDMTileType *this, std::istream *stream, HDDMDevice *hddmDevice, __int64 a4, __int64 a5) { google::protobuf::Message *v6; // rdx __int16 v7; // dx std::string *v8; // rsi __int16 v9; // ax int n0x7FFFFFFF; // edx char v11; // al int n0x7FFFFFFF_2; // edx int n0x7FFFFFFF_4; // edx bool v14; // zf __int16 word18; // ax int n0x7FFFFFFF_6; // edx __int16 word1A; // ax unsigned __int64 v18; // rbx __int64 qwordC0; // rdx unsigned __int64 v20; // rax __int64 *qwordB0; // rbp __int64 qwordA8; // rdx unsigned __int64 v23; // rax __int64 *qwordB0_3; // r13 __int64 *qwordB0_1; // rbx void *p__ZNSs4_Rep20_S_empty_rep_storageE; // rdi __int64 v27; // rbp __int64 qword38_1; // rax __int64 v29; // rax _DWORD *v30; // rax HDDMTilePort *v31; // rbx HDDMTilePort **hddmTilePortVec; // rax __int64 v33; // r12 int word1C_1; // ebx __int64 v35; // rbp __int64 v36; // rbp int word2_1; // ebx __int64 v38; // r12 int v39; // r13d __int64 v40; // rbp int word1C_2; // r12d _WORD *ushortVec; // rdx int v43; // eax int v44; // esi __int64 qword200; // rdx char *p_char1F8; // rsi __int64 p_char1F8_1; // rax __int64 v48; // rdx char v49; // al int v50; // r14d HDDMTileFace *v51; // rbx const HDDMWire *v52; // rbp HDDMTilePort *v53; // r12 HDDMTilePort **v54; // rax __int64 v55; // rax google::protobuf::Message *v56; // rdx __int64 *qwordB0_2; // r14 __int64 v58; // rax void *p__ZNSs4_Rep20_S_empty_rep_storageE_1; // rdi int v60; // edx unsigned int hddmDeviceb; // [rsp+0h] [rbp-1A8h] unsigned int v64; // [rsp+10h] [rbp-198h] __int64 v65; // [rsp+18h] [rbp-190h] int v66; // [rsp+18h] [rbp-190h] int v67; // [rsp+20h] [rbp-188h] unsigned __int16 v69; // [rsp+3Ch] [rbp-16Ch] unsigned __int16 v70; // [rsp+3Eh] [rbp-16Ah] char v71; // [rsp+5Fh] [rbp-149h] BYREF _QWORD v72[2]; // [rsp+60h] [rbp-148h] BYREF _QWORD v73[2]; // [rsp+70h] [rbp-138h] BYREF HDDMTilePort *v74[2]; // [rsp+80h] [rbp-128h] BYREF _QWORD v75[2]; // [rsp+90h] [rbp-118h] BYREF int v76; // [rsp+A0h] [rbp-108h] int v77; // [rsp+A4h] [rbp-104h] unsigned int hddmDeviceb_1; // [rsp+A8h] [rbp-100h] unsigned int v79; // [rsp+ACh] [rbp-FCh] int word1C_3; // [rsp+B0h] [rbp-F8h] char v81; // [rsp+B8h] [rbp-F0h] _BYTE tileType_msg[16]; // [rsp+C0h] [rbp-E8h] BYREF int word2; // [rsp+D0h] [rbp-D8h] __int16 v84; // [rsp+D4h] [rbp-D4h] int word1C; // [rsp+D8h] [rbp-D0h] int n0x7FFFFFFF_1; // [rsp+DCh] [rbp-CCh] int n0x7FFFFFFF_3; // [rsp+E0h] [rbp-C8h] int n0x7FFFFFFF_5; // [rsp+E4h] [rbp-C4h] int n0x7FFFFFFF_7; // [rsp+E8h] [rbp-C0h] int word18_1; // [rsp+ECh] [rbp-BCh] std::string *v91; // [rsp+F0h] [rbp-B8h] std::string *v92; // [rsp+F8h] [rbp-B0h] int word1A_1; // [rsp+100h] [rbp-A8h] int v94; // [rsp+104h] [rbp-A4h] __int64 v95; // [rsp+108h] [rbp-A0h] int v96; // [rsp+110h] [rbp-98h] __int64 v97; // [rsp+140h] [rbp-68h] int v98; // [rsp+148h] [rbp-60h] int v99; // [rsp+168h] [rbp-40h] if ( HDDMDeviceDump::useXngMarks ) std::istream::read(stream, HDDMDeviceDump::markBuffer, 8); if ( !(_BYTE)byte_992F640 && __cxa_guard_acquire(&byte_992F640) ) { dword_992F530 = HDDMTileType::createtypenamemap((HDDMTileType *)&byte_992F640); __cxa_guard_release(&byte_992F640); } HDDMXng::TileType::TileType((HDDMXng::TileType *)tileType_msg); HDDMDevice::readMessage((HDDMDevice *)stream, (std::istream *)tileType_msg, v6); v7 = v84; v8 = v91; HIWORD(this->tileType_code) = word2; v9 = (v7 << 6) | this->tileType_code & 0x3F; n0x7FFFFFFF = 0x7FFFFFFF; LOWORD(this->tileType_code) = v9; LOWORD(this->tileType_code7) = word1C; v11 = v99; if ( (v99 & 8) != 0 ) n0x7FFFFFFF = n0x7FFFFFFF_1; this->tileType_code2 = n0x7FFFFFFF; n0x7FFFFFFF_2 = 0x7FFFFFFF; if ( (v11 & 0x10) != 0 ) n0x7FFFFFFF_2 = n0x7FFFFFFF_3; this->tileType_code3 = n0x7FFFFFFF_2; n0x7FFFFFFF_4 = 0x7FFFFFFF; if ( (v11 & 0x20) != 0 ) n0x7FFFFFFF_4 = n0x7FFFFFFF_5; v14 = (v11 & 0x40) == 0; word18 = word18_1; this->tileType_code4 = n0x7FFFFFFF_4; n0x7FFFFFFF_6 = 0x7FFFFFFF; if ( !v14 ) n0x7FFFFFFF_6 = n0x7FFFFFFF_7; LOWORD(this->tileType_code6) = word18; word1A = word1A_1; this->tileType_code5 = n0x7FFFFFFF_6; HIWORD(this->tileType_code6) = word1A; std::string::assign((std::string *)&this->gname, v8); std::string::assign((std::string *)&this->hwname, v92); HDDMTileType::settypeenum(this); v18 = v96; v67 = v96; std::vector<HDDMSiteType *>::resize(&this->hddmSiteTypeVec, v96); std::vector<unsigned short>::resize(&this->ushortVec, v18); qwordC0 = this->qwordC0; v20 = (this->qwordC8 - qwordC0) >> 2; if ( v18 > v20 ) { std::vector<std::pair<short,short>>::_M_default_append(&this->qwordC0, v18 - v20); } else if ( v18 < v20 ) { this->qwordC8 = qwordC0 + 4 * v18; } qwordB0 = (__int64 *)this->qwordB0; qwordA8 = this->qwordA8; v23 = ((__int64)qwordB0 - qwordA8) >> 3; if ( v18 > v23 ) { std::vector<std::string>::_M_default_append(&this->qwordA8, v18 - v23); } else if ( v18 < v23 ) { qwordB0_3 = (__int64 *)(qwordA8 + 8 * v18); if ( qwordB0 != qwordB0_3 ) { if ( &_pthread_key_create ) { qwordB0_1 = (__int64 *)(qwordA8 + 8 * v18); do { p__ZNSs4_Rep20_S_empty_rep_storageE = (void *)(*qwordB0_1 - 24); if ( p__ZNSs4_Rep20_S_empty_rep_storageE != &std::string::_Rep::_S_empty_rep_storage && _InterlockedExchangeAdd((volatile signed __int32 *)(*qwordB0_1 - 8), 0xFFFFFFFF) <= 0 ) { std::string::_Rep::_M_destroy(p__ZNSs4_Rep20_S_empty_rep_storageE, v75); } ++qwordB0_1; } while ( qwordB0 != qwordB0_1 ); } else { qwordB0_2 = (__int64 *)(qwordA8 + 8 * v18); do { v58 = *qwordB0_2; p__ZNSs4_Rep20_S_empty_rep_storageE_1 = (void *)(*qwordB0_2 - 24); if ( p__ZNSs4_Rep20_S_empty_rep_storageE_1 != &std::string::_Rep::_S_empty_rep_storage ) { v60 = *(_DWORD *)(v58 - 8); *(_DWORD *)(v58 - 8) = v60 - 1; if ( v60 <= 0 ) std::string::_Rep::_M_destroy(p__ZNSs4_Rep20_S_empty_rep_storageE_1, v75); } ++qwordB0_2; } while ( qwordB0 != qwordB0_2 ); } } this->qwordB0 = qwordB0_3; } if ( v67 > 0 ) { v27 = 0; do { v29 = *(_QWORD *)(v95 + 8 * v27); *(_QWORD *)(this->hddmSiteTypeVec + 8 * v27) = *(_QWORD *)(hddmDevice->qword90 + 8LL * *(unsigned __int16 *)(v29 + 24)); *(_WORD *)(this->ushortVec + 2 * v27) = *(_DWORD *)(v29 + 28); *(_WORD *)(this->qwordC0 + 4 * v27) = *(_DWORD *)(v29 + 32); *(_WORD *)(this->qwordC0 + 4 * v27 + 2) = *(_DWORD *)(v29 + 36); std::string::assign((std::string *)(this->qwordA8 + 8 * v27), *(const std::string **)(v29 + 16)); std::string::string((std::string *)v72, (const std::string *)(this->qwordA8 + 8 * v27)); v65 = *(_QWORD *)(this->hddmSiteTypeVec + 8 * v27); v30 = (_DWORD *)operator new(0x40u); *(_QWORD *)v30 = this; v30[2] = (unsigned __int16)v27; v31 = (HDDMTilePort *)v30; std::string::string((std::string *)(v30 + 4), (const std::string *)v72); *((_QWORD *)v31 + 5) = 0; *((_QWORD *)v31 + 6) = 0; *((_QWORD *)v31 + 7) = 0; *((_QWORD *)v31 + 4) = v31; *((_QWORD *)v31 + 3) = v65; v74[0] = v31; std::string::_Rep::_M_dispose(v72[0] - 24LL, v75); hddmTilePortVec = (HDDMTilePort **)this->hddmTilePortVec; if ( hddmTilePortVec == (HDDMTilePort **)this->qword40 ) { std::vector<HDDMSiteChildDef *>::_M_emplace_back_aux<HDDMSiteChildDef * const&>(&this->hddmSiteChildDefVec, v74); } else { if ( hddmTilePortVec ) { *hddmTilePortVec = v74[0]; qword38_1 = this->hddmTilePortVec; } else { qword38_1 = 0; } this->hddmTilePortVec = qword38_1 + 8; } std::string::string((std::string *)v75, (const std::string *)(this->qwordA8 + 8 * v27)); v75[1] = v74[0]; std::_Rb_tree<std::string,std::pair<std::string const,HDDMSiteChildDef *>,std::_Select1st<std::pair<std::string const,HDDMSiteChildDef *>>,std::less<std::string>,std::allocator<std::pair<std::string const,HDDMSiteChildDef *>>>::_M_insert_unique<std::pair<std::string,HDDMSiteChildDef *>>( &this->qword40 + 1, v75); ++v27; std::string::_Rep::_M_dispose(v75[0] - 24LL, v73); } while ( v67 > (int)v27 ); } HDDMTileType::allocatewires(this, this->tileType_code7); v33 = 0; word1C_1 = 0; if ( LOWORD(this->tileType_code7) ) { do { v35 = this->hddmWireVec + v33; HDDMWire::readme_pb(v35, stream, hddmDevice, a5); *(_WORD *)(v35 + 10) = word1C_1; std::string::string((std::string *)v73, (const std::string *)(v35 + 32)); *(_WORD *)std::map<std::string,unsigned short>::operator[](this->gap1C0, v73) = word1C_1++; v33 += 88; std::string::_Rep::_M_dispose(v73[0] - 24LL, v75); } while ( LOWORD(this->tileType_code7) > word1C_1 ); } HDDMTileType::allocatearcs(this, HIWORD(this->tileType_code)); v36 = 0; word2_1 = 0; if ( HIWORD(this->tileType_code) ) { do { v38 = this->hddmArcVec + v36; HDDMArc::readme_pb((HDDMArc *)v38, stream, hddmDevice); *(_WORD *)(v38 + 6) = word2_1++; v36 += 24; } while ( HIWORD(this->tileType_code) > word2_1 ); } v39 = v98; std::vector<unsigned short>::resize(&this->qword1A8, v98); v40 = 0; if ( v39 > 0 ) { while ( 1 ) { while ( 1 ) { word1C_2 = *(_DWORD *)(v97 + 4 * v40); if ( word1C_2 >= 0 ) break; LABEL_59: if ( v39 <= (int)++v40 ) goto LABEL_60; } *(_WORD *)(this->qword1A8 + 2 * v40) = word1C_2; if ( (_WORD)v67 ) { ushortVec = (_WORD *)this->ushortVec; v43 = 1; while ( 1 ) { v44 = v43; if ( (unsigned __int16)v40 >= *ushortVec && ((unsigned __int16)v67 == v43 || (unsigned __int16)v40 < ushortVec[1]) ) { break; } ++ushortVec; ++v43; if ( (unsigned __int16)v67 <= v44 ) goto LABEL_47; } v70 = v43 - 1; v69 = v40 - *ushortVec; } LABEL_47: qword200 = this->qword200; LOWORD(v75[0]) = word1C_2; p_char1F8 = &this->?; if ( !qword200 ) goto LABEL_75; do { while ( (unsigned __int16)word1C_2 <= *(_WORD *)(qword200 + 32) ) { p_char1F8 = (char *)qword200; qword200 = *(_QWORD *)(qword200 + 16); if ( !qword200 ) goto LABEL_52; } qword200 = *(_QWORD *)(qword200 + 24); } while ( qword200 ); LABEL_52: if ( &this->? == p_char1F8 || (unsigned __int16)word1C_2 < *((_WORD *)p_char1F8 + 16) ) { LABEL_75: v74[0] = (HDDMTilePort *)v75; p_char1F8_1 = std::_Rb_tree<unsigned short,std::pair<unsigned short const,std::pair<unsigned short,unsigned short>>,std::_Select1st<std::pair<unsigned short const,std::pair<unsigned short,unsigned short>>>,std::less<unsigned short>,std::allocator<std::pair<unsigned short const,std::pair<unsigned short,unsigned short>>>>::_M_emplace_hint_unique<std::piecewise_construct_t const&,std::tuple<unsigned short &&>,std::tuple<>>( this->?, p_char1F8, &qword_7B6AC49, v74, &v71, word1C_2); } else { p_char1F8_1 = (__int64)p_char1F8; } *(_WORD *)(p_char1F8_1 + 34) = v70; *(_WORD *)(p_char1F8_1 + 36) = v69; v48 = 0; if ( LOWORD(this->tileType_code7) > (unsigned __int16)word1C_2 ) v48 = this->hddmWireVec + 88LL * (unsigned __int16)word1C_2; v49 = *(_BYTE *)(*(_QWORD *)(*(_QWORD *)(this->hddmSiteTypeVec + 8LL * v70) + 24LL) + 16LL * v69 + 5) & 0xC0; switch ( v49 ) { case 0: *(_BYTE *)(v48 + 2) |= 5u; goto LABEL_59; case 0x80: ++v40; *(_BYTE *)(v48 + 2) |= 6u; if ( v39 <= (int)v40 ) goto LABEL_60; break; case 0x40: ++v40; *(_BYTE *)(v48 + 2) |= 7u; if ( v39 <= (int)v40 ) goto LABEL_60; break; default: goto LABEL_59; } } } LABEL_60: HDDMTileType::createedgeds(this); HDDMTileType::createwirearcs(this, hddmDevice); HDDMTileType::marknulltiles(this); HDDMTileType::allocatetileports(this); v66 = v94; if ( v94 ) { if ( HDDMDeviceDump::useXngMarks ) std::istream::read(stream, HDDMDeviceDump::markBuffer, 5); v50 = 0; do { HDDMXng::TilePort::TilePort((HDDMXng::TilePort *)v75); HDDMDevice::readMessage((HDDMDevice *)stream, (std::istream *)v75, v56); hddmDeviceb = hddmDeviceb_1; v64 = v79; if ( (v81 & 0x10) != 0 ) { v51 = *(HDDMTileFace **)(*(_QWORD *)(*(_QWORD *)(this->qword228 + 8LL * (unsigned __int16)v76) + 24LL) + 8LL * (unsigned __int16)v77); if ( (unsigned __int16)word1C_3 >= LOWORD(this->tileType_code7) ) v52 = 0; else v52 = (const HDDMWire *)(this->hddmWireVec + 88LL * (unsigned __int16)word1C_3); } else { v52 = 0; v51 = *(HDDMTileFace **)(*(_QWORD *)(*(_QWORD *)(this->qword228 + 8LL * (unsigned __int16)v76) + 24LL) + 8LL * (unsigned __int16)v77); } v53 = (HDDMTilePort *)operator new(0x18u); HDDMTilePort::HDDMTilePort(v53, v51, hddmDeviceb, v64, v52); v74[0] = v53; v54 = (HDDMTilePort **)*((_QWORD *)v51 + 4); if ( v54 == *((HDDMTilePort ***)v51 + 5) ) { std::vector<HDDMTilePort *>::_M_emplace_back_aux<HDDMTilePort * const&>((char *)v51 + 24, v74); } else { if ( v54 ) { *v54 = v53; v55 = *((_QWORD *)v51 + 4); } else { v55 = 0; } *((_QWORD *)v51 + 4) = v55 + 8; } if ( v52 ) HDDMWire::addtileport(v52, v74[0]); ++v50; HDDMXng::TilePort::~TilePort((HDDMXng::TilePort *)v75); } while ( v50 != v66 ); } HDDMXng::TileType::~TileType((HDDMXng::TileType *)tileType_msg); } void __fastcall HDDMTileType::writeme_pb(HDDMTileType *this, std::ostream *stream, __int16 a3) { int n0x7FFFFFFF; // ecx int v6; // eax int tileType_code3; // eax int tileType_code6_low; // edx std::string *p__ZN6google8protobuf8internal12kEmptyStringE_3; // rdi __int64 v10; // rax __int64 v11; // r12 __int64 v12; // r14 __int64 v13; // rbx __int64 v14; // rax std::string *p__ZN6google8protobuf8internal12kEmptyStringE_2; // rdi int v16; // eax int v17; // edx int v18; // edx int v19; // edx __int64 qwordA8; // rdx const std::string *v21; // r13 __int64 v22; // rax int v23; // esi __int64 qword1A8; // rax __int64 src_2; // rdx __int64 v26; // rbx __int64 v27; // r13 int v28; // r12d __int64 v29; // rax int v30; // eax __int64 *src_1; // r14 unsigned __int64 v32; // rdi __int64 v33; // r12 int v34; // ebx __int64 v35; // r12 int v36; // ebx void *v37; // rdi google::protobuf::internal::RepeatedPtrFieldBase *v38; // rbp unsigned __int16 ***v39; // rbx unsigned __int16 **v40; // r13 __int64 v41; // r14 unsigned __int16 *v42; // r15 int v43; // eax int v44; // edx int v45; // edx const google::protobuf::Message *v46; // rdx std::string *p__ZN6google8protobuf8internal12kEmptyStringE_4; // rdi google::protobuf::internal::RepeatedPtrFieldBase *v49; // [rsp+10h] [rbp-148h] void *v50; // [rsp+20h] [rbp-138h] BYREF _BYTE *v51; // [rsp+28h] [rbp-130h] __int64 v52; // [rsp+30h] [rbp-128h] _BYTE v53[16]; // [rsp+40h] [rbp-118h] BYREF int v54; // [rsp+50h] [rbp-108h] int v55; // [rsp+54h] [rbp-104h] int v56; // [rsp+58h] [rbp-100h] int v57; // [rsp+5Ch] [rbp-FCh] int v58; // [rsp+60h] [rbp-F8h] int v59; // [rsp+68h] [rbp-F0h] _BYTE v60[16]; // [rsp+70h] [rbp-E8h] BYREF int tileType_code_high; // [rsp+80h] [rbp-D8h] int v62; // [rsp+84h] [rbp-D4h] int tileType_code7_low; // [rsp+88h] [rbp-D0h] int n0x7FFFFFFF_1; // [rsp+8Ch] [rbp-CCh] int tileType_code3_1; // [rsp+90h] [rbp-C8h] int tileType_code4; // [rsp+94h] [rbp-C4h] int tileType_code5; // [rsp+98h] [rbp-C0h] int tileType_code6_low_1; // [rsp+9Ch] [rbp-BCh] std::string *p__ZN6google8protobuf8internal12kEmptyStringE; // [rsp+A0h] [rbp-B8h] std::string *p__ZN6google8protobuf8internal12kEmptyStringE_1; // [rsp+A8h] [rbp-B0h] int tileType_code6_high; // [rsp+B0h] [rbp-A8h] int v72; // [rsp+B4h] [rbp-A4h] __int64 v73; // [rsp+B8h] [rbp-A0h] BYREF int v74; // [rsp+C0h] [rbp-98h] int v75; // [rsp+C4h] [rbp-94h] int v76; // [rsp+C8h] [rbp-90h] void *src; // [rsp+F0h] [rbp-68h] int v78; // [rsp+F8h] [rbp-60h] int v79; // [rsp+FCh] [rbp-5Ch] __int64 v80; // [rsp+100h] [rbp-58h] BYREF int v81; // [rsp+118h] [rbp-40h] if ( HDDMDeviceDump::useXngMarks ) std::ostream::write(stream, "TILETYPE", 8); HDDMXng::TileType::TileType((HDDMXng::TileType *)v60); n0x7FFFFFFF = this->tileType_code2; tileType_code_high = HIWORD(this->tileType_code); v62 = LOWORD(this->tileType_code) >> 6; tileType_code7_low = LOWORD(this->tileType_code7); v6 = v81 | 7; if ( n0x7FFFFFFF != 0x7FFFFFFF ) { tileType_code3 = this->tileType_code3; n0x7FFFFFFF_1 = n0x7FFFFFFF; tileType_code3_1 = tileType_code3; tileType_code4 = this->tileType_code4; tileType_code5 = this->tileType_code5; v6 = v81 | 0x7F; } tileType_code6_low = LOWORD(this->tileType_code6); p__ZN6google8protobuf8internal12kEmptyStringE_3 = p__ZN6google8protobuf8internal12kEmptyStringE; v81 = v6 | 0x380; tileType_code6_low_1 = tileType_code6_low; tileType_code6_high = HIWORD(this->tileType_code6); if ( p__ZN6google8protobuf8internal12kEmptyStringE == (std::string *)&google::protobuf::internal::kEmptyString ) { p__ZN6google8protobuf8internal12kEmptyStringE_3 = (std::string *)operator new(8u); *(_QWORD *)p__ZN6google8protobuf8internal12kEmptyStringE_3 = (char *)&std::string::_Rep::_S_empty_rep_storage + 24; p__ZN6google8protobuf8internal12kEmptyStringE = p__ZN6google8protobuf8internal12kEmptyStringE_3; } std::string::assign(p__ZN6google8protobuf8internal12kEmptyStringE_3, (const std::string *)&this->gname); if ( *((_QWORD *)this->hwname - 3) ) { p__ZN6google8protobuf8internal12kEmptyStringE_4 = p__ZN6google8protobuf8internal12kEmptyStringE_1; v81 |= 0x400u; if ( p__ZN6google8protobuf8internal12kEmptyStringE_1 == (std::string *)&google::protobuf::internal::kEmptyString ) { p__ZN6google8protobuf8internal12kEmptyStringE_4 = (std::string *)operator new(8u); *(_QWORD *)p__ZN6google8protobuf8internal12kEmptyStringE_4 = (char *)&std::string::_Rep::_S_empty_rep_storage + 24; p__ZN6google8protobuf8internal12kEmptyStringE_1 = p__ZN6google8protobuf8internal12kEmptyStringE_4; } std::string::assign(p__ZN6google8protobuf8internal12kEmptyStringE_4, (const std::string *)&this->hwname); } v50 = 0; v51 = 0; v52 = 0; if ( a3 ) { HDDMTileType::getAllTilePorts(this, &v50); if ( v51 != v50 ) { v81 |= 0x2000u; v72 = (v51 - (_BYTE *)v50) >> 3; } } v10 = (__int64)(this->qword80 - this->hddmSiteTypeVec) >> 3; if ( (_WORD)v10 ) { v11 = 0; v12 = 2LL * ((unsigned int)(unsigned __int16)v10 - 1) + 2; do { v22 = v74; v23 = v75; if ( v74 >= v75 ) { if ( v75 == v76 ) { google::protobuf::internal::RepeatedPtrFieldBase::Reserve( (google::protobuf::internal::RepeatedPtrFieldBase *)&v73, v75 + 1); v23 = v75; } v75 = v23 + 1; v13 = operator new(0x30u); HDDMXng::SiteChildDef::SiteChildDef((HDDMXng::SiteChildDef *)v13); v14 = v74++; *(_QWORD *)(v73 + 8 * v14) = v13; } else { ++v74; v13 = *(_QWORD *)(v73 + 8 * v22); } p__ZN6google8protobuf8internal12kEmptyStringE_2 = *(std::string **)(v13 + 16); v16 = *(_DWORD *)(v13 + 44); *(_DWORD *)(v13 + 24) = *(_WORD *)(*(_QWORD *)(this->hddmSiteTypeVec + 4 * v11) + 10LL) >> 6; *(_DWORD *)(v13 + 44) = v16 | 1; v17 = *(unsigned __int16 *)(this->ushortVec + v11); *(_DWORD *)(v13 + 44) = v16 | 5; *(_DWORD *)(v13 + 28) = v17; v18 = *(__int16 *)(this->qwordC0 + 2 * v11); *(_DWORD *)(v13 + 44) = v16 | 0xD; *(_DWORD *)(v13 + 32) = v18; v19 = *(__int16 *)(this->qwordC0 + 2 * v11 + 2); *(_DWORD *)(v13 + 44) = v16 | 0x1D; *(_DWORD *)(v13 + 36) = v19; qwordA8 = this->qwordA8; *(_DWORD *)(v13 + 44) = v16 | 0x1F; v21 = (const std::string *)(qwordA8 + 4 * v11); if ( p__ZN6google8protobuf8internal12kEmptyStringE_2 == (std::string *)&google::protobuf::internal::kEmptyString ) { p__ZN6google8protobuf8internal12kEmptyStringE_2 = (std::string *)operator new(8u); *(_QWORD *)p__ZN6google8protobuf8internal12kEmptyStringE_2 = (char *)&std::string::_Rep::_S_empty_rep_storage + 24; *(_QWORD *)(v13 + 16) = p__ZN6google8protobuf8internal12kEmptyStringE_2; } std::string::assign(p__ZN6google8protobuf8internal12kEmptyStringE_2, v21); v11 += 2; } while ( v11 != v12 ); } qword1A8 = this->qword1A8; src_2 = (this->qword1B0 - qword1A8) >> 1; if ( (_WORD)src_2 ) { v26 = 0; v27 = 2LL * ((unsigned int)(unsigned __int16)src_2 - 1) + 2; while ( 1 ) { v28 = *(unsigned __int16 *)(qword1A8 + v26); v29 = v78; if ( v78 == v79 ) { v30 = v78 + 1; src_1 = (__int64 *)src; if ( 2 * v78 >= v78 + 1 ) v30 = 2 * v78; v79 = v30; v32 = 4LL * v30; if ( (unsigned __int64)v30 > 0x1FC0000000000000LL ) v32 = -1; src = (void *)operator new[](v32); memcpy(src, src_1, 4LL * v78); if ( src_1 != &v80 && src_1 ) operator delete[](src_1); v29 = v78; } v26 += 2; v78 = v29 + 1; src_2 = (__int64)src; *((_DWORD *)src + v29) = v28; if ( v26 == v27 ) break; qword1A8 = this->qword1A8; } } HDDMDevice::writeMessage((HDDMDevice *)stream, (std::ostream *)v60, (const google::protobuf::Message *)src_2); v33 = 0; v34 = 0; if ( LOWORD(this->tileType_code7) ) { do { HDDMWire::writeme_pb(this->hddmWireVec + v33, stream); ++v34; v33 += 88; } while ( LOWORD(this->tileType_code7) > v34 ); } v35 = 0; v36 = 0; if ( HIWORD(this->tileType_code) ) { do { HDDMArc::writeme_pb(this->hddmArcVec + v35, stream); ++v36; v35 += 24; } while ( HIWORD(this->tileType_code) > v36 ); } v37 = v51; v38 = (google::protobuf::internal::RepeatedPtrFieldBase *)v50; if ( v51 != v50 ) { v49 = (google::protobuf::internal::RepeatedPtrFieldBase *)v51; if ( HDDMDeviceDump::useXngMarks && (std::ostream::write(stream, "PORTS", 5), v38 = (google::protobuf::internal::RepeatedPtrFieldBase *)v50, v49 = (google::protobuf::internal::RepeatedPtrFieldBase *)v51, v50 == v51) ) { v37 = v50; } else { do { v39 = *(unsigned __int16 ****)v38; v40 = **(unsigned __int16 ****)v38; v41 = *(_QWORD *)(*(_QWORD *)v38 + 16LL); v42 = *v40; HDDMXng::TilePort::TilePort((HDDMXng::TilePort *)v53); v43 = v59; v54 = *v42; v59 |= 1u; v44 = *((unsigned __int16 *)v40 + 4); v59 = v43 | 3; v55 = v44; v45 = *((_DWORD *)v39 + 2); v59 = v43 | 7; v56 = v45; v46 = (const google::protobuf::Message *)*((unsigned int *)v39 + 3); v59 = v43 | 0xF; v57 = (int)v46; if ( v41 ) { v46 = (const google::protobuf::Message *)*(unsigned __int16 *)(v41 + 10); v59 = v43 | 0x1F; v58 = (int)v46; } HDDMDevice::writeMessage((HDDMDevice *)stream, (std::ostream *)v53, v46); v38 = (google::protobuf::internal::RepeatedPtrFieldBase *)((char *)v38 + 8); HDDMXng::TilePort::~TilePort((HDDMXng::TilePort *)v53); } while ( v49 != v38 ); v37 = v50; } } if ( v37 ) operator delete(v37); HDDMXng::TileType::~TileType((HDDMXng::TileType *)v60); } void __fastcall HDDMTileType::print(HDDMTileType *this, std::ostream *stream, const std::string *fileName) { __int64 v5; // rax __int64 v6; // rax __int64 v7; // rax __int64 tileType_code_high; // rbx __int64 v9; // rax __int64 v10; // rax unsigned __int8 v11; // r14 __int64 v12; // r12 __int64 v13; // rbx __int64 v14; // rax __int64 v15; // rax __int64 v16; // rax __int64 v17; // rax __int64 v18; // rax __int64 v19; // rax __int64 v20; // rax __int64 tileType_code7_low; // rbx __int64 v22; // rax __int64 v23; // rax __int64 v24; // rax __int64 v25; // rax __int64 v26; // rax __int64 v27; // rax unsigned int tileType_code4; // r14d __int64 v29; // rax __int64 v30; // rax __int64 v31; // rax __int64 v32; // rax __int64 v33; // rax __int64 v34; // rax __int64 v35; // rax __int64 v36; // rax __int64 v37; // rax __int64 tileType_code6_low; // rbx __int64 tileType_code6_high; // r12 __int64 v40; // rax __int64 v41; // rax __int64 v42; // rax __int64 v43; // rax __int64 v44; // rax unsigned __int16 word1C_1; // bx __int64 v46; // r12 int word2_1; // ebx HDDMArc *v48; // rdi __int64 v49; // rbx __int64 v50; // rax __int64 v51; // rax __int64 v52; // r14 __int64 v53; // rax __int64 v54; // rax __int64 v55; // rax __int64 v56; // rbx __int64 v57; // r12 __int64 v58; // rax __int64 v59; // rax __int64 v60; // rax __int64 v61; // rbx __int64 v62; // rax __int64 v63; // rbx _QWORD *v64; // r14 __int64 v65; // rax __int64 v66; // r12 __int64 v67; // rax unsigned int tileType_code5; // [rsp+10h] [rbp-68h] __int64 v69; // [rsp+10h] [rbp-68h] __int64 v70; // [rsp+18h] [rbp-60h] char v71; // [rsp+2Fh] [rbp-49h] BYREF _QWORD v72[9]; // [rsp+30h] [rbp-48h] BYREF v5 = std::__ostream_insert<char,std::char_traits<char>>( stream, *(_QWORD *)fileName, *(_QWORD *)(*(_QWORD *)fileName - 24LL)); v6 = std::operator<<<std::char_traits<char>>(v5, "TILETYPE "); v7 = std::__ostream_insert<char,std::char_traits<char>>(v6, this->gname, *((_QWORD *)this->gname - 3)); std::endl<char,std::char_traits<char>>(v7); tileType_code_high = HIWORD(this->tileType_code); v9 = std::__ostream_insert<char,std::char_traits<char>>( stream, *(_QWORD *)fileName, *(_QWORD *)(*(_QWORD *)fileName - 24LL)); v10 = std::operator<<<std::char_traits<char>>(v9, "m_numarcs : "); std::ostream::_M_insert<unsigned long>(v10, tileType_code_high); v11 = this->tileType_code & 0xF; v12 = LOBYTE(this->tileType_code) >> 5; v13 = LOWORD(this->tileType_code) >> 6; v14 = std::__ostream_insert<char,std::char_traits<char>>( stream, *(_QWORD *)fileName, *(_QWORD *)(*(_QWORD *)fileName - 24LL)); v15 = std::operator<<<std::char_traits<char>>(v14, " m_deviceid : "); v16 = std::ostream::_M_insert<unsigned long>(v15, v11); v17 = std::operator<<<std::char_traits<char>>(v16, " m_interconnct : "); v18 = std::ostream::_M_insert<unsigned long>(v17, v12 & 1); v19 = std::operator<<<std::char_traits<char>>(v18, " m_gidx : "); v20 = std::ostream::_M_insert<unsigned long>(v19, (unsigned __int16)v13); std::endl<char,std::char_traits<char>>(v20); tileType_code7_low = LOWORD(this->tileType_code7); v22 = std::__ostream_insert<char,std::char_traits<char>>( stream, *(_QWORD *)fileName, *(_QWORD *)(*(_QWORD *)fileName - 24LL)); v23 = std::operator<<<std::char_traits<char>>(v22, " m_numwires : "); v24 = std::ostream::_M_insert<unsigned long>(v23, tileType_code7_low); std::endl<char,std::char_traits<char>>(v24); HDDMTileType::getTileTypeName(v72, HIWORD(this->tileType_code1) >> 4); v25 = std::__ostream_insert<char,std::char_traits<char>>( stream, *(_QWORD *)fileName, *(_QWORD *)(*(_QWORD *)fileName - 24LL)); v26 = std::operator<<<std::char_traits<char>>(v25, " m_ttypeenum : "); v27 = std::__ostream_insert<char,std::char_traits<char>>(v26, v72[0], *(_QWORD *)(v72[0] - 24LL)); std::endl<char,std::char_traits<char>>(v27); std::string::_Rep::_M_dispose(v72[0] - 24LL, &v71); LODWORD(tileType_code7_low) = this->tileType_code2; LODWORD(v12) = this->tileType_code3; tileType_code4 = this->tileType_code4; tileType_code5 = this->tileType_code5; v29 = std::__ostream_insert<char,std::char_traits<char>>( stream, *(_QWORD *)fileName, *(_QWORD *)(*(_QWORD *)fileName - 24LL)); v30 = std::operator<<<std::char_traits<char>>(v29, "m_xmin : "); v31 = std::ostream::operator<<(v30, (unsigned int)tileType_code7_low); v32 = std::operator<<<std::char_traits<char>>(v31, " m_xmax : "); v33 = std::ostream::operator<<(v32, (unsigned int)v12); v34 = std::operator<<<std::char_traits<char>>(v33, " m_ymin : "); v35 = std::ostream::operator<<(v34, tileType_code4); v36 = std::operator<<<std::char_traits<char>>(v35, " m_ymax : "); v37 = std::ostream::operator<<(v36, tileType_code5); std::endl<char,std::char_traits<char>>(v37); tileType_code6_low = LOWORD(this->tileType_code6); tileType_code6_high = HIWORD(this->tileType_code6); v40 = std::__ostream_insert<char,std::char_traits<char>>( stream, *(_QWORD *)fileName, *(_QWORD *)(*(_QWORD *)fileName - 24LL)); v41 = std::operator<<<std::char_traits<char>>(v40, "m_xgridextent : "); v42 = std::ostream::_M_insert<unsigned long>(v41, tileType_code6_low); v43 = std::operator<<<std::char_traits<char>>(v42, " m_ygridextent : "); v44 = std::ostream::_M_insert<unsigned long>(v43, tileType_code6_high); std::endl<char,std::char_traits<char>>(v44); word1C_1 = this->tileType_code7; if ( word1C_1 ) { v52 = 0; v53 = std::__ostream_insert<char,std::char_traits<char>>( stream, *(_QWORD *)fileName, *(_QWORD *)(*(_QWORD *)fileName - 24LL)); v54 = std::operator<<<std::char_traits<char>>(v53, "WIRES :"); std::endl<char,std::char_traits<char>>(v54); v55 = (unsigned int)word1C_1 - 1; v56 = 88 * v55; v57 = 88 * (v55 + 1); while ( 1 ) { HDDMWire::print((HDDMWire *)(this->hddmWireVec + v52), stream, fileName); if ( v52 == v56 ) break; v52 += 88; std::__ostream_insert<char,std::char_traits<char>>(stream, ",", 1); std::endl<char,std::char_traits<char>>(stream); if ( v52 == v57 ) goto LABEL_2; } v58 = std::operator<<<std::char_traits<char>>(stream, ";"); std::endl<char,std::char_traits<char>>(v58); } LABEL_2: v46 = 0; word2_1 = 0; if ( HIWORD(this->tileType_code) ) { do { v48 = (HDDMArc *)(this->hddmArcVec + v46); ++word2_1; v46 += 24; HDDMArc::print(v48, stream, fileName); } while ( HIWORD(this->tileType_code) > word2_1 ); } v49 = (__int64)(this->qword80 - this->hddmSiteTypeVec) >> 3; if ( (_DWORD)v49 ) { v59 = std::__ostream_insert<char,std::char_traits<char>>( stream, *(_QWORD *)fileName, *(_QWORD *)(*(_QWORD *)fileName - 24LL)); v60 = std::operator<<<std::char_traits<char>>(v59, "CHILDREN :"); std::endl<char,std::char_traits<char>>(v60); if ( (int)v49 > 0 ) { v61 = (unsigned int)(v49 - 1); v70 = 8 * v61 + 8; v62 = 8 * v61; v63 = 0; v69 = v62; while ( 1 ) { v64 = (_QWORD *)(this->qwordA8 + v63); std::string::string((std::string *)v72, (const std::string *)(*(_QWORD *)(this->hddmSiteTypeVec + v63) + 32LL)); v65 = std::__ostream_insert<char,std::char_traits<char>>( stream, *(_QWORD *)fileName, *(_QWORD *)(*(_QWORD *)fileName - 24LL)); v66 = std::__ostream_insert<char,std::char_traits<char>>(v65, v72[0], *(_QWORD *)(v72[0] - 24LL)); std::__ostream_insert<char,std::char_traits<char>>(v66, " ", 1); std::__ostream_insert<char,std::char_traits<char>>(v66, *v64, *(_QWORD *)(*v64 - 24LL)); std::string::_Rep::_M_dispose(v72[0] - 24LL, &v71); if ( v63 == v69 ) break; v63 += 8; std::__ostream_insert<char,std::char_traits<char>>(stream, ",", 1); std::endl<char,std::char_traits<char>>(stream); if ( v63 == v70 ) goto LABEL_5; } v67 = std::operator<<<std::char_traits<char>>(stream, ";"); std::endl<char,std::char_traits<char>>(v67); } } LABEL_5: v50 = std::__ostream_insert<char,std::char_traits<char>>( stream, *(_QWORD *)fileName, *(_QWORD *)(*(_QWORD *)fileName - 24LL)); v51 = std::operator<<<std::char_traits<char>>(v50, "end BLOCK;"); std::endl<char,std::char_traits<char>>(v51); }
最新发布
10-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值