友链
转换代码: htmL+js
<label for="name">TYPE----------------------</label><br/>
<select name="cars" id="carstype" onchange="my_select_change_Function()">
<option value="volvo">code segment</option>
<option value="saab">data segment</option>
</select>
<div id="div_to_be_filled"><p>
<input type="checkbox" id="cbox1" value="first_checkbox">
<label for="cbox1">C</label>
</p>
<p>
<input type="checkbox" id="cbox2" value="second_checkbox" >
<label for="cbox2">R</label>
</p></div>
<br />
<label for="name">S-------------------------</label><br/>
<div id="div_tsssssssssssssssssssssssso_be_filled">
<fieldset>
<div>
<input type="radio" id="huey" name="droneSSSS" value="huey"
checked>
<label for="huey">system segment</label>
</div>
<div>
<input type="radio" id="dewey" name="droneSSSS" value="dewey">
<label for="dewey">code/data segment</label>
</div>
</fieldset>
</div>
<br />
<label for="name">DPL-----------------------</label><br/>
<select name="cars" id="carsDPL" >
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<br />
<label for="name">P---------------------</label><br/>
<div id="div_tssssssssssss111sssssssssssso_be_filled"><p>
<input type="checkbox" id="cbox4" value="first_checkbox">
<label for="cbox4">segment exist</label>
</p>
</p></div>
<br />
<label for="name">D/B flag--------------</label><br/>
<div id="div_tssssssssssss111ssssssssssssssassso_be_filled">
<fieldset>
<div>
<input type="radio" id="huey32" name="dronedddddddddddddddb" value="huessy"
checked>
<label for="huey32">16 bit</label>
</div>
<div>
<input type="radio" id="dewey64" name="dronedddddddddddddddb" value="dewssey">
<label for="dewey64">32 bit</label>
</div>
</fieldset></div>
<br />
<label for="name">G--------------</label><br/>
<div id="div_tssssssssssss111ssssssssssggggssssassso_be_filled">
<fieldset>
<div>
<input type="radio" id="huey32G" name="droneGGGGG" value="huaaey"
checked>
<label for="huey32G">bytes</label>
</div>
<div>
<input type="radio" id="dewey64G" name="droneGGGGG" value="dewaaey">
<label for="dewey64G">4 KB</label>
</div>
</fieldset></div>
<label for="name">Segment Base Address--------</label><br/>
<input type="text" id="namesegbase" name="name" required
minlength="4" maxlength="1111111111118" size="10">
<br />
<label for="name">Segment Edge----------------</label>
<br />
<input type="text" id="namesegbaseedge" name="name" required
minlength="4" maxlength="1111111111111118" size="10">
<br /> <br /> <br />
<button type="button" id="demo" onclick="myFunction()">Calculate</button>
<div id="resultsssss"> </div>
<script>
code=1;
function myFunction() {
var dpl_dict = {
"0": '00',
"1": '01',
"2": '10',
"3": '11'
};
var bin_to_hex = {
"0000": '0',
"0001": '1',
"0010": '2',
"0011": '3',
"0100": '4',
"0101": '5',
"0110": '6',
"0111": '7',
"1000": '8',
"1001": '9',
"1010": 'A',
"1011": 'B',
"1100": 'C',
"1101": 'D',
"1110": 'E',
"1111": 'F'
};
// 先处理基地址
segment_base_addr = document.getElementById("namesegbase").value ;
segment_base_addr = segment_base_addr.replace("0x", "");
_length = 8-segment_base_addr.length;
for(let i=0; i<_length; i++)
segment_base_addr = '0' + segment_base_addr;
segment_base_addr = segment_base_addr.toUpperCase();
binary_format = "";
for (let i = 0; i < segment_base_addr.length; i++)
for(var key in bin_to_hex)
if(segment_base_addr[i] == bin_to_hex[key])
binary_format += key;
//console.log(binary_format);
// 二进制形式转换完毕
segment_base_addr_31_24 = "";
for (let i = 0; i < binary_format.length; i++) {
if(i==8) break;
segment_base_addr_31_24 += binary_format[i];
}
segment_base_addr_23_16 = "";
for (let i = 8; i < binary_format.length; i++) {
if(i==16) break;
segment_base_addr_23_16 += binary_format[i];
}
segment_base_addr_15_0 = "";
for (let i = 16; i < binary_format.length; i++) {
segment_base_addr_15_0 += binary_format[i];
}
// 处理段界限
segment_base_edge = document.getElementById("namesegbaseedge").value ;
segment_base_edge = segment_base_edge.replace("0x", "");
_length = 5-segment_base_edge.length;
for(let i=0; i<_length; i++)
segment_base_edge = '0' + segment_base_edge;
segment_base_edge = segment_base_edge.toUpperCase();
binary_format = "";
for (let i = 0; i < segment_base_edge.length; i++)
for(var key in bin_to_hex)
if(segment_base_edge[i] == bin_to_hex[key])
binary_format += key;
segment_base_edge_19_16 = "";
for (let i = 0; i < 20; i++) {
if(i==4) break;
segment_base_edge_19_16 += binary_format[i];
}
segment_base_edge_15_0 = "";
for (let i = 4; i < 20; i++) {
segment_base_edge_15_0 += binary_format[i];
}
// 获取G
radios = document.getElementsByName('droneGGGGG');
_g = ""
for (var i = 0, length = radios.length; i < length; i++) {
if (radios[i].checked)
_g = "0"
else
_g = "1"
break;
}
// 获取D/B flag
radios = document.getElementsByName('dronedddddddddddddddb');
_d_b_flag = ""
for (var i = 0, length = radios.length; i < length; i++) {
if (radios[i].checked)
_d_b_flag = "0"
else
_d_b_flag = "1"
break;
}
// L和AVL默认置0
_l = "0";
_avl = "0";
// 获取P
var obj = document.getElementById('cbox4');
var _p = '';
if(obj.checked)
_p = "1";
else
_p = "0";
// 获取DPL
var e = document.getElementById("carsDPL");
var _dpl = dpl_dict[e.value];
// 获取S
radios = document.getElementsByName('dronedddddddddddddddb');
_s = ""
for (var i = 0, length = radios.length; i < length; i++) {
if (radios[i].checked)
_s = "0"
else
_s = "1"
break;
}
// 获取TYPE
e = document.getElementById("carstype");
_type_type = "";
if ("volvo" == e.value)
_type_type = "1";
else
_type_type = "0";
_type_1 = "0";
_type_2 = "0";
if (document.getElementById("cbox1").checked)
_type_1 = "1";
if (document.getElementById("cbox2").checked)
_type_2 = "1";
_type = _type_type + _type_1 + _type_2 + "0"
// 组装高32bit
high_32 = segment_base_addr_31_24 + _g + _d_b_flag + _l +
_avl + segment_base_edge_19_16 + _p + _dpl + _s + _type + segment_base_addr_23_16;
// 组装低32bit
low_32 = segment_base_addr_15_0 + segment_base_edge_15_0;
// 转换成16进制
_high_32 = "";
for (var i = 0; i < 32;) {
_high_32 += bin_to_hex[high_32[i] + high_32[i+1] + high_32[i+2] + high_32[i+3]];
i+=4;
}
_low_32 = "";
for (var i = 0; i < 32;) {
_low_32 += bin_to_hex[low_32[i] + low_32[i+1] + low_32[i+2] + low_32[i+3]];
i+=4;
}
console.log(_high_32);
console.log(_low_32);
document.getElementById("resultsssss").innerHTML = "0x"+_high_32+"<br/>0x"+_low_32;
}
function my_select_change_Function() {
code++;
if (code%2==0){
document.getElementById("div_to_be_filled").innerHTML = "<p> <input type=\"checkbox\" id=\"cbox1\" value=\"first_checkbox\"> <label for=\"cbox1\">E</label></p><p> <input type=\"checkbox\" id=\"cbox2\" value=\"second_checkbox\"> <label for=\"cbox2\">W</label></p>";
}
else {
document.getElementById("div_to_be_filled").innerHTML = "<p> <input type=\"checkbox\" id=\"cbox1\" value=\"first_checkbox\"> <label for=\"cbox1\">C</label></p><p> <input type=\"checkbox\" id=\"cbox2\" value=\"second_checkbox\"> <label for=\"cbox2\">R</label></p>";
}
}
</script>
解析脚本代码: python
用法;
python 1.py 0x7c0001ff 0x00409800
# https://i.imgur.com/QraS1z5.png
# 低0x7c0001ff,高32 位是0x00409800
"""
# https://i.imgur.com/QraS1z5.png
# 低0x7c0001ff,高32 位是0x00409800
"""
高32bit
31~24
段基地址 31~24
23
G
22
D/B
21
L
20
AVL
19~16
段界限
15
P
14~13
DPL
12
S
11~8
TYPE
7~0
段基址 23~16
低32bit
31~16
段基地址 15~0
15~0
段界限 15~0
"""
"""
低0x7c0001ff,高32 位是0x00409800
先将16进制转换成2进制
"""
import sys
hex_string_to_int = {
'0': 0,
'1': 1,
'2': 2,
'3': 3,
'4': 4,
'5': 5,
'6': 6,
'7': 7,
'8': 8,
'9': 9,
'a': 10,
'b': 11,
'c': 12,
'd': 13,
'e': 14,
'f': 15
}
bin_to_hex = {
"0000": '0',
"0001": '1',
"0010": '2',
"0011": '3',
"0100": '4',
"0101": '5',
"0110": '6',
"0111": '7',
"1000": '8',
"1001": '9',
"1010": 'A',
"1011": 'B',
"1100": 'C',
"1101": 'D',
"1110": 'E',
"1111": 'F'
}
low_hex_presentation = sys.argv[1]
high_hex_presentation = sys.argv[2]
def hex_to_binary(hex_string):
_binary_value = ""
hex_string = hex_string.replace("0x", "")
for c in hex_string:
_binary_value += "{:04b}".format(hex_string_to_int[c])
return _binary_value
# 先处理低32bit
binary_value = hex_to_binary(low_hex_presentation)
segment_edge_15_0 = binary_value[16:]
segment_base_addr_15_0 = binary_value[:16]
# 处理高32bit
binary_value = hex_to_binary(high_hex_presentation)
segment_base_addr_23_16 = binary_value[24:]
_type = binary_value[20:24]
# 解析type:https://i.imgur.com/kOSNpiJ.png
print('TYPE-----------------------------')
# 在初始化的时候,A位总是被至0,因此不用管
# 先看最高bit是0还是1,0表示数据,1表示代码
_type_type = ''
if _type[0:1] is '0':
_type_type = 'data'
else:
_type_type = 'code'
print('\t' + _type_type + " segment:")
print("\t\tprivileges:")
if _type_type is 'data':
print("\t\t\tread")
if _type[1:2] is '1':
print("\t\t\tstack down")
else:
print("\t\t\tstack up");
if _type[2:3] is '1':
print("\t\t\twrite")
else:
print("\t\t\texecute")
if _type[1:2] is '0':
print("\t\t\tsame level")
else:
print("\t\t\tlow to high");
if _type[2:3] is '1':
print("\t\tread")
# 解析描述符类型
print('S--------------------------------')
if binary_value[19:20] is '1':
print("\tsystem segment")
else:
print("\tcode/data segment")
# 解析描述符的特权级 DPL
dpl = binary_value[17:19]
print('DPL------------------------------')
if dpl[0] is '0' and dpl[1] is '0':
print('\tlevel 0')
if dpl[0] is '0' and dpl[1] is '1':
print('\tlevel 1')
if dpl[0] is '1' and dpl[1] is '0':
print('\tlevel 2')
if dpl[0] is '1' and dpl[1] is '1':
print('\tlevel 3')
# 解析段存在位
# 这个位置是用于硬盘虚拟内存,如果P为0,则表示段不存在,此时会抛出一个异常
# 然后处理器就会从硬盘中将该段换回到内存中
print('P--------------------------------')
_p = binary_value[16:17]
if _p is '0':
print("\tsegment not exists")
else:
print("\tsegment exists")
segment_edge_19_16 = binary_value[12:16]
# 解析AVL
print('AVL------------------------------')
print("\tnot so important, just set it to " + binary_value[11:12])
# 解析L
print('L--------------------------------')
_l = binary_value[10:11]
print("\tthis bit is reserved for 64 bit processor, just set it to " + _l)
# 解析D/B,默认的操作数大小/默认的栈指针大小标志
print('D/B Flag-------------------------')
_d_b = binary_value[9:10]
if _d_b is '0':
print("\tpointer is 16 bit")
else:
print("\tpointer is 32 bit")
# 解析G,粒度,用于解释段界限的含义
print('G--------------------------------')
_g = binary_value[8:9]
if _g is '0':
print("\tbytes")
if _g is '1':
print("\t4*1024 bytes")
segment_base_addr_31_24 = binary_value[0:8]
segment_base_addr = segment_base_addr_31_24 + segment_base_addr_23_16 + segment_base_addr_15_0
segment_base_addr = \
bin_to_hex[segment_base_addr[0:4]] + \
bin_to_hex[segment_base_addr[4:8]] + \
bin_to_hex[segment_base_addr[8:12]] + \
bin_to_hex[segment_base_addr[12:16]] + \
bin_to_hex[segment_base_addr[16:20]] + \
bin_to_hex[segment_base_addr[20:24]] + \
bin_to_hex[segment_base_addr[24:28]] + \
bin_to_hex[segment_base_addr[28:]]
print("Segment Base Address-------------")
print("\t0x" + segment_base_addr)
segment_edge = segment_edge_19_16 + segment_edge_15_0
segment_edge = \
bin_to_hex[segment_edge[0:4]] + \
bin_to_hex[segment_edge[4:8]] + \
bin_to_hex[segment_edge[8:12]] + \
bin_to_hex[segment_edge[12:16]] + \
bin_to_hex[segment_edge[16:20]]
print("Segment Edge---------------------")
print("\t0x" + segment_edge)