1、在c程序中直接访问内存空间
写入以下程序并调试
main() { *(char *)0x2000 = 'a'; *(int *)0x2000 = 0xf; *(char far *)0x20001000 = 'a'; _AX = 0x2000; *(char *)_AX = 'b'; _BX = 0x1000; *(char *)(_BX + _BX) = 'a'; *(char far *)(0x20001000 + _BX) = *(char *)_AX; }
编译连接后用debug调试,反汇编到01FA处,如图:
可以看到编译器对这些指令的处理为:
*(char *)0x2000 = 'a'; -> mov byte ptr ds:[2000h],'a'
*(int *)0x2000 = 0xf; -> mov word ptr ds:[2000h],000Fh
*(char far *)0x20001000 = 'a'; -> mov bx,2000h
mov es,bx
mov bx,1000h
mov byte ptr es:[bx],'a'
_AX = 0x2000; -> mov ax,2000h
*(char *)_AX = 'b'; -> mov bx,ax
mov byte ptr [bx],'b'
_BX = 0x1000; -> mov bx,1000h
*(char *)(_BX+_BX) = 'a'; -> add bx,bx
mov byte ptr ds:[bx],'a'
*(char far*)(0x20001000+_BX)=*(char*)_AX; ->
mov bx,ax
mov al,[bx]
xor cx,cx
add bx,1000h
adc cx,2000h
mov es,cx
mov es:[bx],al
具备了以上的基础知识,我们就可以向任意内存写入数据。可以像汇编一样通过写显存来显示字符。测试以下代码
main() { _BX = 80*12*2+40*2; *(char far *)(0xb8000000 + _BX) = 'a'; *(char far *)(0xb8000000 + _BX + 1) = 0x2;