问题描述
lahf指令的描述为:
该指令如上所述在兼容模式和传统模式下执行。仅当cpuID.80000001H:ECX.LAHF-SAHF [bit 0] = 1
时,它才在64位模式下有效。
第一个问题:什么是兼容性和旧版模式。它们与实模式和保护模式有何不同
第二个问题:什么是 cpuID.80000001H:ECX.LAHF-SAHF [bit 0] = 1
谢谢!
解决方法
什么是兼容性和旧版模式。它们与实模式和保护模式有何不同
80x86 CPU具有多种模式。软件开发人员可能关心的是实模式,保护模式和长模式。但是还有系统管理模式(主要是“仅固件使用”),“非活动”(等待启动)等。
保护模式具有多个子模式(16位,32位,virtual8086)。
长模式具有多个子模式(16位,32位,64位)。
“传统模式”是指实模式和保护模式(以及所有保护模式的子模式),而不是长模式或其任何子模式;其中代码是16位或32位(实模式和保护模式之间的其他差异对于大多数指令而言并不重要,而仅对段寄存器加载和操作系统内核等而言才有意义)。存在旧模式可以向后兼容旧软件/操作系统(例如,MS-DOS将不支持长时间模式,将使用实模式,Windows95将不使用长时间模式,而将使用保护模式,等等)。 / p>
兼容模式是长模式的16位和32位子模式。存在兼容模式(或长模式的16位和32位子模式)以允许较新的OS执行为较旧的OS设计的程序(例如,允许运行64位版本的Windows)专为32位版本的Windows设计的应用程序)。在这种情况下,代码可以是16位或32位(类似于传统模式)。但它与传统模式不同,因为它仍使用长模式机制进行分页,中断等。对于兼容模式,即使当前执行的代码不是,内核也应为64位。
第二个问题:CPUID.80000001H:ECX.LAHF-SAHF [bit 0] = 1
是什么意思
CPUID指令返回有关CPU的信息。因为有很多信息,所以信息会分为几组/“叶”,其中import numpy as np
from matplotlib import pyplot as plt
plt.style.use('fivethirtyeight')
ages_x = [25,26,27,28,29,30,31,32,33,34,35]
x_indexes=np.arange(len(ages_x))
width= 0.25
dev_y = [38496,42000,46752,49320,53200,56000,62316,64928,67317,68748,73752]
plt.bar(x_indexes,dev_y,width=width,color= '#444444',label= 'All Devs')
py_dev_y = [45372,48876,53850,57287,63016,65998,70003,70000,71496,75370,83640]
plt.bar(x_indexes - width,py_dev_y,label= 'Python')
js_dev_y = [37810,43515,46823,49293,53437,56373,62375,66674,68745,68746,74583]
plt.bar(x_indexes + width,js_dev_y,label= 'JavaScript')
plt.title('Median Salary (USD) by Age')
plt.xlabel('Ages')
plt.ylabel('Median Salary (USD)')
plt.legend()
plt.xticks(ticks=x_indexes,labels= ages_x)
plt.tight_layout()
plt.show()
中的值确定CPUID指令将返回哪些信息(在某些情况下,ECX还会修改返回的信息)。该信息在通用寄存器(EAX,EBX,ECX,EDX)中返回。
“ ---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-69-ad69a2071340> in <module>()
24 plt.ylabel('Median Salary (USD)')
25 plt.legend()
---> 26 plt.xticks(ticks=x_indexes,labels= ages_x)
27 plt.tight_layout()
28
/opt/conda/lib/python3.6/site-packages/matplotlib/pyplot.py in xticks(*args,**kwargs)
1705 if len(kwargs):
1706 for l in labels:
-> 1707 l.update(kwargs)
1708
1709 return locs,silent_list('Text xticklabel',labels)
/opt/conda/lib/python3.6/site-packages/matplotlib/text.py in update(self,kwargs)
241 """
242 bbox = kwargs.pop('bbox',None)
--> 243 super(Text,self).update(kwargs)
244 if bbox:
245 self.set_bbox(bbox) # depends on font properties
/opt/conda/lib/python3.6/site-packages/matplotlib/artist.py in update(self,props)
883 try:
884 ret = [_update_property(self,k,v)
--> 885 for k,v in props.items()]
886 finally:
887 self.eventson = store
/opt/conda/lib/python3.6/site-packages/matplotlib/artist.py in <listcomp>(.0)
883 try:
884 ret = [_update_property(self,v in props.items()]
886 finally:
887 self.eventson = store
/opt/conda/lib/python3.6/site-packages/matplotlib/artist.py in _update_property(self,v)
876 func = getattr(self,'set_' + k,None)
877 if func is None or not six.callable(func):
--> 878 raise AttributeError('Unknown property %s' % k)
879 return func(v)
880
AttributeError: Unknown property ticks
”表示“当用EAX = 0x80000001调用CPUID时,ECX的位0中CPUID指令返回的值”(EAX
部分只是AMD的名称决定给那一点。
换句话说,您的代码可能看起来像(Intel语法汇编):
CPUID.80000001H:ECX.LAHF-SAHF[bit 0]