将VS内联汇编器转换为GCC内联汇编器

时间:2018-12-10 20:44:40

标签: gcc assembly x86-16 gas

我发现此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*/
      }
   }
}

2 个答案:

答案 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关于内联汇编的文档也很相关,但是在我的记忆中有些不透明,更加详细,涵盖了更多详细的体系结构(但可能是最新的)。

(对不起,无法在我的手机上放置链接。快速搜索应将它们作为第一匹配。)