嵌入式汇编和机器码的反汇编

以下程序是0.11 Linux中的一段嵌入式汇编代码

#define __set_tssldt_desc(n, addr, type) \
__asm__ ("movw $104, %1\n\t" \
         "movw %%ax, %2\n\t" \
         "rorl $16, %%eax\n\t" \
         "movb %%al, %3\n\t" \
         "movb $"type ", %4\n\t" \
         "movb $0x00, %5\n\t" \
         "movb %%ah, %6\n\t" \
         "rorl $16, %%eax" \
         :
         :"a"(addr), "m"(*(n)), "m"(*(n+2)), "m"(*(n+4)), \
          "m"(*(n+5)), "m"(*(n+6)), "m"(*(n+7)) \
        )

我在用bochs 2.1.1版本debug的过程中,看到这段代码对应的实际执行的机器码及其反汇编代码如下:

000072c4: (                    ): mov dword ptr ss:[ebp+0xfffffffc], 0x1847c ; c745fc7c840100
000072cb: (                    ): mov eax, dword ptr ss:[ebp+0xfffffffc] ; 8b45fc
000072ce: (                    ): opsize mov word ptr [ds:0x5cd8], 0x68 ; 66c705d85c00006800
000072d7: (                    ): opsize mov [ds:0x5cda], ax ; 66a3da5c0000
000072dd: (                    ): ror eax, 0x10             ; c1c810
000072e0: (                    ): mov al, byte ptr [ds:0x5cdc] ; 8805dc5c0000
000072e6: (                    ): mov byte ptr [ds:0x5cdd], 0x89 ; c605dd5c000089
000072ed: (                    ): mov byte ptr [ds:0x5cde], 0x0 ; c605de5c000000
000072f4: (                    ): mov ah, byte ptr [ds:0x5cdf] ; 8825df5c0000
000072fa: (                    ): ror eax, 0x10             ; c1c810

两段代码的对应关系如下:

行数 嵌入式汇编 机器码的反汇编
1 “movw $104, %1\n\t” opsize mov word ptr [ds:0x5cd8], 0x68
2 “movw %%ax, %2\n\t” opsize mov [ds:0x5cda], ax
3 “rorl $16, %%eax\n\t” ror eax, 0x10
4 “movb %%al, %3\n\t” mov al, byte ptr [ds:0x5cdc]
5 “movb $”type “, %4\n\t” mov byte ptr [ds:0x5cdd], 0x89
6 “movb $0x00, %5\n\t” mov byte ptr [ds:0x5cde], 0x0
7 “movb %%ah, %6\n\t” mov ah, byte ptr [ds:0x5cdf]
8 “rorl $16, %%eax” ror eax, 0x10

我不太理解的地方是第4行和第7行的代码对应关系。
以第四行举例,嵌入式汇编是把寄存器al的值放入变量3对应的内存中,而从机器码的反汇编结果来看,像是把地址ds:0x5cdf中的值放入ah中。
但是我在单步执行的时候查看了寄存器eax,并未被改变,而ds:0x5cdc却被改变了,难道是反汇编的翻译错误?

搜到oldlinux的讨论,居然版主也不知道为什么有双向的赋值。。。。

我又用bochs 2.3.7版本进行debug,看到反汇编的代码如下:

000072c4: (                    ): mov dword ptr ss:[ebp+0xfffffffc], 0x0001847c; c745fc7c840100
000072cb: (                    ): mov eax, dword ptr ss:[ebp+0xfffffffc] ; 8b45fc
000072ce: (                    ): mov word ptr ds:0x5cd8, 0x0068 ; 66c705d85c00006800
000072d7: (                    ): mov word ptr ds:0x5cda, ax ; 66a3da5c0000
000072dd: (                    ): ror eax, 0x10             ; c1c810
000072e0: (                    ): mov byte ptr ds:0x5cdc, al ; 8805dc5c0000
000072e6: (                    ): mov byte ptr ds:0x5cdd, 0x89 ; c605dd5c000089
000072ed: (                    ): mov byte ptr ds:0x5cde, 0x00 ; c605de5c000000
000072f4: (                    ): mov byte ptr ds:0x5cdf, ah ; 8825df5c0000
000072fa: (                    ): ror eax, 0x10             ; c1c810

这段代码的反汇编结果已经被修正,看来是bochs 2.1.1反汇编时出错了

阅读更多
换一批

没有更多推荐了,返回首页