關於io指令的問題

2021-06-01 12:59:19 字數 3140 閱讀 1240

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 只呼叫一次,指令第一次繫...