@ dd 0FFFFFFFFh ; Link to next device-header block
dw 8000h ; Driver "device attributes "
dw Strat ; "Strategy " routine offset
VLF equ $-2 ; (VDS "lock " flag after initialization)
IDEAdr equ $-1 ; (Lower IDE status address, after init)
dw DevInt ; "Device-Interrupt " routine offset
PCIAdr equ $-2 ; (PCI UDMA command address, after init)
db 16,16, 'UDMA$ ',0 ; Driver name (arrows avoid user errors)
......
mov [bx+IDEAdr-@],bp; Set IDE & PCI device-address bytes
......
Strat mov [cs:Packet],bx ; Save DOS request-packet address
......
------------------------------
以上是一个驱动程序的部分代码。
IDEAdr、VLF是不是分别代表(@+4+2+2-1)、(@+4+2+2-2)?
执行 mov [bx+IDEAdr-@],bp; 前bx已经清零,这条语句是不是把bp的值存到(@+4+2+2-1)这个地址?
------解决方案--------------------------------------------------------
> IDEAdr、VLF是不是分别代表(@+4+2+2-1)、(@+4+2+2-2)?
IDEAdr、VLF分别代表(@+4+2+2-1-1)、(@+4+2+2-2-1)。
> 执行 mov [bx+IDEAdr-@],bp; 前bx已经清零,这条语句是不是把bp的值存到(@+4+2+2-1)这个地址?
bx+IDEAdr-@=> 0+(@+4+2+2-1-1)-@=> 6
把bp的内容存储到DS:[bx+IDEAdr-@]处,即[DS:0006 ]处。