C语言与画面显示的练习
目标:1、用C语言实现内存写入;2、挑战指针;3、色号设定;
1、用C语言实现内存写入
_write_mem8: ; void write_mem8(int addr, int data);
MOV ECX,[ESP+4] ; [ESP+4],addr为第一个参数,故为ESP+4
MOV AL,[ESP+8]; [ESP+8],data为第二个参数,故为ESP+8
MOV [ECX],AL
RET
INSTRSET:它用来告诉nask,这个程序是个486用的。
2、挑战指针
char *p;//用于BYTE类地址
short *p;//用于WORD类地址
int *p;//用于DWORD类地址
p[i]不一定是数组,它与*
(
p+i)意思完全相同。
3、色号设定
CPU的引脚与内存、键盘、网卡、声卡、软盘等相连。向设备发送电信号是OUT指令,向设备取得电信号是IN指令。为了区别不同的设备,需要设备号码称为port(端口)。
调色板的方位步骤:
1、在一连串的访问中屏蔽中断(比如CLI);
2、将想要设定的调色板号码写入0x03c8,紧接着,按R,G,B的顺序写入0x03c9。如果还想继续设定下一个调色板,则省略调色板号码,再按照RGB的顺序写入0x03c9就行;
3、如果想要读出当前调色板的状态,首先要将调色板的号码写入0x03c7,再从0x03c9读取3次。读出的顺序就是R,G,B。如果要继续读出下一个调色板,同样也是省略调色板号码的设定,按RGB的顺序读出。
4、如果最初执行CLI,那么最后要执行STI。
EFLAGS寄存器:由名为FLAGS的16位寄存器扩展而来的32位寄存器。FLAGS是存储仅为标志和中断标志等标志的寄存器。进位标志可以通过JC或JNC等跳转指令来简单地判断到底是0还是1。但对于中断标志,没有类似的JI或JNI命令,所以只能读入EFLAGS,再检查第9位是0还是1。
和EFLAGS寄存器相关的,没有“MOV EAX,EFLAGS”之类的指令。对于EFLAGS寄存器的读写只能通过PUSHFD和POPFD指令。
PUSHFD POP EAX ;MOV EAX,EFLAGS
PUSH EAX POPFD ;MOV EFLAGS,EAXA
用static定义的数组类型一般的DB形式,避免了赋值。
table_rgb:
DB 0x00, 0x00,0x00,0xff,......