x32 段描述符解析及转换脚本

友链

在这里插入图片描述

转换代码: 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)

**在这里插入图片描述**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值