在学校考完试后在学校耍了两天的游戏就匆匆的回家了,带了几本C程序设计的书(《C和指针》,《Programming in C》,《Windows 程序设计》)打算回家啃一啃。不过,情况几本和以前一样,回去先玩了几天才开始的。
最先看的是《Windows 程序设计》,开始还是和其他书类似,以Hello World开始,不过这个和以前看C语言控制台编程不大一样,耍起来比较有趣。
开启visual studio 2005,创建win32应用程序,照着书敲代码:
#include “stdafx.h”
#include “winapi1.h”
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MessageBox(NULL,TEXT(“Hello world!”),TEXT(“Hello”),0);//消息框
return 0;
}
但是到后面一章,看得我头都大了。说的是Unicode,看这章我页页打瞌睡,有时候还睡着了。总之比较了windows系统以前不同版本之间对Unicode的支持情况,林林总总讲了许多宽字符的概念,在后面给有一个格式化消息框的程序代码,我照着敲,连注释都敲进去了,但运行不起来,无语极了(后来实在搞不定,就不甩了,继续看下去):【2月11日已经解决不能运行的问题了,纯属个人原因,代码敲漏】
/*SCRNSIZE.C–Display screen size in a message box (c) Charles Petzold,1998*/
#include<windows.h>
#include<tchar.h>
#include<stdio.h>
int CDECL MessageBoxPrintf(TCHAR *szCaption,TCHAR *szFormat,…)
{
TCHAR szBuffer[1024];
va_list pArgList;
//the va_start macro(defined in STDARG.H)is usually equivalent to:
//pArgList=(char*)&szFormat+sizeof(szFormat);
va_start(pArgList,szFormat);
//The last argument to wsprintf points to argument
_vsntprintf(szBuffer,sizeof(szBuffer)/sizeof(TCHAR),szFormat,pArgList);
//the va_end macro just zeroes out pArgList for no good reason
va_end(pArgList);
return MessageBox(NULL,szBuffer,szCaption,0);
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
int cxScreen,cyScreen;
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
MessageBoxPrintf(TEXT(“ScmSize”),TEXT(“The screen is %i pixels wide by %i pixels high.”),cxScreen,cyScreen);
return 0;
}
看这书,优点枯燥,还容易让人打瞌睡,我便上网找找WINODWS API视频教程,发现高质量的教程真少,在IT播吧找到了思成老师做的windows api视频教程,看了感觉讲得不错,不过还没出完,对着目录来看,只出到了“键盘”那章,但我还是把那些视屏全给下载下来了,爽歪歪啊!!!
之后在IT播吧顺藤摸瓜发现了播布客这个强大的视频教程网站,接着又发现了“大灰狼”老师出的汇编程序设计,一时兴趣又来了,一口气把30个学时的视频教程全部下载下来,虽然不大,但一个个下还真累人啊,还好有资源探测器要不下死人咯……之所以对汇编感兴趣是有原因的:在以前一位IT网友建议以后打算做程序软件开发这一块的的程序爱好者学习汇编,特别是386后的保护模式,方便以后搞开发,这是一个原因;另外我喜欢玩网络游戏,我曾今想做外挂,这样玩游戏没那么辛苦(以前也买过外挂来用),但要做外挂要求有一定的汇编基础,这是第二个原因;第三嘛,就是到大二汇编也会开课,现在耍耍汇编,到时候应该不会那么辛苦。这是以前的想法,但现在我把这汇编视频看了一大半,发现这东西很值得学,我学了这一点点虽说不上会(我现在甚至连hello world都搞不定,在C语言那就一两行代码,但在这….),但我对CPU,内存等工作原理的了解大大加深了,昨天讲“中断”解决了之前在学C时遇到的许多奇怪的问题,特别是对“栈”的了解,以前我压根就不知道这栈是什么玩意,现在看了教程了解了一下,感觉好多了!!
这是汇编的Hello World(当时没多认真去思考,这寄存器都没怎么记得):
data segment
msg db “hello world”
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0b800h
mov es,bx
mov cx,11
mov si,0
mov bx,0
mov ah,01000010b
s:mov al,ds:[si]
mov es:[bx],al
mov es:[bx+1],ah
inc si
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
这是中断处理的源代码:
code segment
;第一步:把终端向量表中0号号表项的内容进行修改,
;使之指向自己编写的的中断处理程序的入口地址
start:
mov ax,0
mov ds,ax
mov word ptr ds:[0],0200h
mov word ptr ds:[2],0
;第三部:把我们刚才编写好的0号中断处理程序拷贝到
;中断向量表在中0号表项所指向的地址内存地址0000:0200中
mov ax,cs
mov ds,ax
mov si,offset int0 ;offset把int0所在的内存地址拷贝给si;由此确定了原地址ds:si
mov ax,0
mov es,ax
mov di,200h ;由此确定目的地址
mov cx,offset int0end-offset int0;确定要拷贝的字节数
cld ;又低地址到高地址
rep movsb
;第四步:利用代码自动引发0号中断处理程序
mov ax,1000h
mov bh,1
div bh
;第二部:编写自己的中断处理程序,实现在屏幕中央显示字符串的功能
int0:jmp short int0start ;跳转指令,避开把”I am teacher”当做指令来处理
db “I am teacher”
int0start:mov ax,0b800h
mov es,ax ;配置显存首地址0b800
;要把I am teacher一个个拷贝到显存地址空间中
mov ax,cs
mov ds,ax ;把代码段cs的值复制到数据段ds中
mov si,202h ;由于int0:jump short int0start占两个字节,故从202开始
mov di,12*160+36*2;屏幕显示位置
mov cx,12
s:mov al,ds:[si]
mov es:[di],al
inc si
add di,2
loop s
mov ax,4c00h
int 21h
int0end:nop
code ends
end start
把我了解过的程序设计语言对比起来,就属汇编最特殊,它也是我认识的语言中最接近底层的开发语言,也是效率最高的一种语言。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38327.html