以下程序是0.11 Linux中的一段嵌入式汇编代码
#define __set_tssldt_desc(n, addr, type) \
__asm__ ("movw 4, %1\n\t" \
"movw %%ax, %2\n\t" \
"rorl , %%eax\n\t" \
"movb %%al, %3\n\t" \
"movb $"type ", %4\n\t" \
"movb
以下程序是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反汇编时出错了
x00, %5\n\t" \
"movb %%ah, %6\n\t" \
"rorl , %%eax" \
:
:"a"(addr), "m"(*(n)), "m"(*(n+2)), "m"(*(n+4)), \
"m"(*(n+5)), "m"(*(n+6)), "m"(*(n+7)) \
)
#define __s