什么时候可以在x86-64模式下使用lahf?

问题描述

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]