我发现此C代码带有内联汇编代码:
res=sorted(input_list, key = lambda x : (order[x[:3]],x[:3]))
#['Monday', 'Tuesday', 'Wednesday', 'Cheeseburger', 'Friday', \
# 'Saturday', 'Sunday', 'Thursday']
我试图转换为GNU内联汇编程序,但是失败了,主要是因为GNU内联汇编很杂乱,使用了过时的AT&T语法,而且很难使用。
给我错误的代码:
ReadFromCMOS (unsigned char array [])
{
unsigned char tvalue, index;
for(index = 0; index < 128; index++)
{
_asm
{
cli /* Disable interrupts*/
mov al, index /* Move index address*/
/* since the 0x80 bit of al is not set, NMI is active */
out 0x70,al /* Copy address to CMOS register*/
/* some kind of real delay here is probably best */
in al,0x71 /* Fetch 1 byte to al*/
sti /* Enable interrupts*/
mov tvalue,al
}
array[index] = tvalue;
}
}
WriteTOCMOS(unsigned char array[])
{
unsigned char index;
for(index = 0; index < 128; index++)
{
unsigned char tvalue = array[index];
_asm
{
cli /* Clear interrupts*/
mov al,index /* move index address*/
out 0x70,al /* copy address to CMOS register*/
/* some kind of real delay here is probably best */
mov al,tvalue /* move value to al*/
out 0x71,al /* write 1 byte to CMOS*/
sti /* Enable interrupts*/
}
}
}
答案 0 :(得分:3)
尝试这样的事情:
from PyQt5 import QtCore, QtWidgets, QtWebEngineCore,QtWebEngineWidgets
class TestQFile(QtCore.QFile):
def __init__(self, fileName):
super().__init__()
self.setFileName(fileName)
class TestHandler(QtWebEngineCore.QWebEngineUrlSchemeHandler):
def requestStarted(self, request):
self.file = TestQFile("ken.js")
request.reply(b'text/javascript', self.file)
class TestWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self._view = QtWebEngineWidgets.QWebEngineView(self)
self._handler = TestHandler() # Must keep ref
self._view.page().profile().installUrlSchemeHandler(b'myuri', self._handler)
self._view.setHtml('<html><head><title>Test</title></head><body><div id="d1"></div><script src="myuri://test/ken.js"></script></body></html>')
self.setCentralWidget(self._view)
self.show()
self.raise_()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
win = TestWindow()
sys.exit(app.exec_())
请注意,为/* read from CMOS */
asm ("cli; outb %1, $0x70; inb $0x71, %0; sti" : "=a"(tvalue) : "a"(index));
/* write to CMOS */
unsigned char i = index;
asm volatile ("cli; outb %0, $0x70; movb %1, %%al; outb %%al, $0x71; sti" : "+a"(i) : "rm"(tvalue));
使用额外的变量是可选的。您还可以指定
tvalue
或
"+a"(array[index])
直接。重要的是,您传递的表达式具有字节大小的类型,因此gcc选择"a"(array[index])
而不是al
。
需要将eax
分配给index
才能使i
遭受破坏,而无需更改al
的值。此代码应该可以正常工作。另外,第二组指令也可以分为两部分:
index
这避免了需要额外的变量,并在选择寄存器时为编译器提供了更大的灵活性。
答案 1 :(得分:0)
看一看(古老的)GCC内联汇编HOWTO(面向i686 Linux,因此很可能适合您使用),仔细检查参数传递/约束(它们允许GCC通过以下方式正确安排调用代码):例如将输入/输出放置在使用的寄存器中)。 GCC关于内联汇编的文档也很相关,但是在我的记忆中有些不透明,更加详细,涵盖了更多详细的体系结构(但可能是最新的)。
(对不起,无法在我的手机上放置链接。快速搜索应将它们作为第一匹配。)