p = (uint16_t)ata->ata_io_base + 2;
addr = (byte_t *)(&aa.aa_low);
outb(p++,(byte_t)(0xff & (byte_t)sn));
outb(p++,*addr++);
outb(p++,*addr++);
outb(p++,*addr++);
outb(p++,*addr);
kprintf("send ata command.port:%04x cmd:%02x ",p,cmd);
//outb(p, cmd);
__asm
kprintf("ok!\n");
上面的**在跑的時候,有時候會出現非法指令的異常,實在找不到在**出現的錯誤。跑出來的結果見下圖:
看輸出的結果非常奇怪,eip居然和ebx的內容一樣,但是對應的反彙編根本沒有使用ebx的間接跳轉,而且如果有的話,之前使用到這個**的地方也應該會觸發異常。誰能幫忙分析分析。反彙編出來的**是:
; 199 : p = (uint16_t)ata->ata_io_base + 2;
000e7 66 8b 37 mov si, word ptr [edi]
; 200 : addr = (byte_t *)(&aa.aa_low);
; 201 : outb(p++,(byte_t)(0xff & (byte_t)sn));
000ea 8b 4d 18 mov ecx, dword ptr _sn$[ebp]
000ed 66 83 c6 02 add si, 2
000f1 51 push ecx
000f2 8b c6 mov eax, esi
000f4 25 ff ff 00 00 and eax, 65535 ; 0000ffffh
000f9 46 inc esi
000fa 50 push eax
000fb e8 00 00 00 00 call _i386_outb
; 202 : outb(p++,*addr++);
00100 8b c6 mov eax, esi
00102 53 push ebx
00103 25 ff ff 00 00 and eax, 65535 ; 0000ffffh
00108 46 inc esi
00109 50 push eax
0010a e8 00 00 00 00 call _i386_outb
; 203 : outb(p++,*addr++);
0010f 8b 55 f5 mov edx, dword ptr _aa$[ebp+1]
00112 8b c6 mov eax, esi
00114 25 ff ff 00 00 and eax, 65535 ; 0000ffffh
00119 52 push edx
0011a 50 push eax
0011b 46 inc esi
0011c e8 00 00 00 00 call _i386_outb
; 204 : outb(p++,*addr++);
00121 8b 4d f6 mov ecx, dword ptr _aa$[ebp+2]
00124 8b c6 mov eax, esi
00126 25 ff ff 00 00 and eax, 65535 ; 0000ffffh
0012b 51 push ecx
0012c 50 push eax
0012d 46 inc esi
0012e e8 00 00 00 00 call _i386_outb
; 205 : outb(p++,*addr);
00133 8b 55 f7 mov edx, dword ptr _aa$[ebp+3]
00136 8b c6 mov eax, esi
00138 25 ff ff 00 00 and eax, 65535 ; 0000ffffh
0013d 46 inc esi
0013e 52 push edx
0013f 50 push eax
00140 89 75 18 mov dword ptr _p$[ebp], esi
00143 e8 00 00 00 00 call _i386_outb
; 206 : kprintf("send ata command.port:%04x cmd:%02x ",p,cmd);
00148 8b 45 0c mov eax, dword ptr _cmd$[ebp]
0014b 81 e6 ff ff 00
00 and esi, 65535 ; 0000ffffh
00151 25 ff 00 00 00 and eax, 255 ; 000000ffh
00156 50 push eax
00157 56 push esi
00158 68 00 00 00 00 push offset flat:??_c@_0cf@dcib@send?5ata?5command?4port?3?$cf04x?5cmd?3?$cf@ ; `string'
0015d e8 00 00 00 00 call _kprintf
; 207 : //outb(p, cmd);
; 208 : __asm
; 213 :
; 214 : kprintf("ok!\n");
0016a 68 00 00 00 00 push offset flat:??_c@_04kfob@ok?$cb?6?$aa@ ; `string'
0016f e8 00 00 00 00 call _kprintf
00174 83 c4 38 add esp, 56 ; 00000038h
關於對接諸葛IO 解決的問題
php if session is identify function function php session is identify 0 unset session is login 中 如上 如果不使用 清 session 則會導致 先執行完 再執行 此時已經清空,所以打點始終無效 如果使用j...
IO指令模擬流程
e6 70 66 9c 66 9d是一條寫指令,以它為例來講解一下io指令模擬流程。vmx vmexit handler handle mmio 指令由虛擬機器下發,由xen收到進行處理。asmlinkage voidvmx vmexit handler struct cpu user regs r...
關於vue的自定義指令問題
今天學習了vue的自定義指令 自定義指令 全域性自定義指令 區域性自定義指令 全域性自定義指令 參照官網上的例子 vue.directive focus new vue 而區域性自定義指令就是在vue例項物件或者元件中 new vue 而自定義指令有相應的鉤子函式 bind 只呼叫一次,指令第一次繫...