使用YASM编程 - 06
2017-09-12 18:22
155 查看
我们写汇编程序的时候,往往无法基于汇编代码的思考,只能使用类C语言的方式来进行编程。于是就要从C语言->最细伪代码->用寄存器替代为机器理解代码。
现在以起泡法举例。
我们将上面代码分解为最小单元
1 定义 i
2 定义 j
3 初始化 i = 1
4 比较 i >=n 跳出15
5 初始化 j = 0
6 比较 j>=n-i 跳出 14
7 获得 buf+j 元素
8 获得 buf+j+1 元素
9 比较 buf+i buf+j+1元素
10 大于 则 跳12
11 j++ 跳到 6
12 交换 buf+i buf+j+1元素
13 跳到11
14 i++ 跳到4
15
再翻译为汇编
最终的代码
现在以起泡法举例。
bubble() { int a[]={5,10,4,29,33,47,18}; int n = sizeof(a)/sizeof(a[0]) for(int i=1;i<n;i++) { for(int j=0;j<n-i;j++) { if(a[j]>=a[j+1]) { int t = a[j]; a[j]=a[j+1]; a[j+1]=t; } } } }
我们将上面代码分解为最小单元
1 定义 i
2 定义 j
3 初始化 i = 1
4 比较 i >=n 跳出15
5 初始化 j = 0
6 比较 j>=n-i 跳出 14
7 获得 buf+j 元素
8 获得 buf+j+1 元素
9 比较 buf+i buf+j+1元素
10 大于 则 跳12
11 j++ 跳到 6
12 交换 buf+i buf+j+1元素
13 跳到11
14 i++ 跳到4
15
再翻译为汇编
实现: 1 i 用 ebx push ebx 2 j 用 esi push esi 3 初始化 i = 1 mov ebx,1 4 比较 i >=n 跳出15 cmp ebx,ecx jge 15 5 初始化 j = 0 mov esi,0 6 比较 j>=n-i 跳出 14 lea eax,[ecx-ebx] cmp esi,eax jge 14 7 获得 buf+j 元素 lea eax,[buf+esi*4] 8 获得 buf+j+1 元素 lea edx,[buf+esi*4+4] 9 比较 buf+i buf+j+1元素 mov edi,[edx] cmp [eax],edi 10 大于 则 跳12 jge 12 11 j++ jmp 6 inc esi jmp 6 12 xchg [eax],edi mov [edx],edi 13 jmp 11 14 i++ jmp 4 inc ebx jmp 4
最终的代码
; ------------------------------------------------------------------- ; NASM INC MSVCR_nasm.INC is generated from MASM INC ; by bkdrong@126.com ; ------------------------------------------------------------------- %ifndef MSVCR_INC %define MSVCR_INC [extern __CIacos] [extern __CIasin] [extern __CIatan] [extern __CIatan2] [extern __CIcos] [extern __CIcosh] [extern __CIexp] [extern __CIfmod] [extern __CIlog] [extern __CIlog10] [extern __CIpow] [extern __CIsin] [extern __CIsinh] [extern __CIsqrt] [extern __CItan] [extern __CItanh] [extern __CxxThrowException] [extern __EH_prolog] [extern __Getdays] [extern __Getmonths] [extern __Gettnames] [extern __HUGE] [extern __Strftime] [extern __XcptFilter] [extern ___CxxFrameHandler] [extern ___CxxLongjmpUnwind] [extern ___RTCastToVoid] [extern ___RTDynamicCast] [extern ___RTtypeid] [extern ___STRINGTOLD] [extern ___argc] [extern ___argv] [extern ___badioinfo] [extern ___crtCompareStringA] [extern ___crtGetLocaleInfoW] [extern ___crtLCMapStringA] [extern ___dllonexit] [extern ___doserrno] [extern ___fpecode] [extern ___getmainargs] [extern ___initenv] [extern ___isascii] [extern ___iscsym] [extern ___iscsymf] [extern ___lc_codepage] [extern ___lc_collate_cp] [extern ___lc_handle] [extern ___lconv_init] [extern ___mb_cur_max] [extern ___p___argc] [extern ___p___argv] [extern ___p___initenv] [extern ___p___mb_cur_max] [extern ___p___wargv] [extern ___p___winitenv] [extern ___p__acmdln] [extern ___p__amblksiz] [extern ___p__commode] [extern ___p__daylight] [extern ___p__dstbias] [extern ___p__environ] [extern ___p__fileinfo] [extern ___p__fmode] [extern ___p__iob] [extern ___p__mbcasemap] [extern ___p__mbctype] [extern ___p__osver] [extern ___p__pctype] [extern ___p__pgmptr] [extern ___p__pwctype] [extern ___p__timezone] [extern ___p__tzname] [extern ___p__wcmdln] [extern ___p__wenviron] [extern ___p__winmajor] [extern ___p__winminor] [extern ___p__winver] [extern ___p__wpgmptr] [extern ___pioinfo] [extern ___pxcptinfoptrs] [extern ___set_app_type] [extern ___setlc_active] [extern ___setusermatherr] [extern ___threadhandle] [extern ___threadid] [extern ___toascii] [extern ___unDName] [extern ___unDNameEx] [extern ___unguarded_readlc_active] [extern ___wargv] [extern ___wgetmainargs] [extern ___winitenv] [extern __abnormal_termination] [extern __access] [extern __acmdln] [extern __adj_fdiv_m16i] [extern __adj_fdiv_m32] [extern __adj_fdiv_m32i] [extern __adj_fdiv_m64] [extern __adj_fdiv_r] [extern __adj_fdivr_m16i] [extern __adj_fdivr_m32] [extern __adj_fdivr_m32i] [extern __adj_fdivr_m64] [extern __adj_fpatan] [extern __adj_fprem] [extern __adj_fprem1] [extern __adj_fptan] [extern __adjust_fdiv] [extern __aexit_rtn] [extern __amsg_exit] [extern __assert] [extern __atodbl] [extern __atoi64] [extern __atoldbl] [extern __beep] [extern __beginthread] [extern __beginthreadex] [extern __c_exit] [extern __cabs] [extern __callnewh] [extern __cexit] [extern __cgets] [extern __chdir] [extern __chdrive] [extern __chgsign] [extern __chkesp] [extern __chmod] [extern __chsize] [extern __clearfp] [extern __close] [extern __commit] [extern __commode] [extern __control87] [extern __controlfp] [extern __copysign] [extern __cprintf] [extern __cputs] [extern __creat] [extern __cscanf] [extern __ctime64] [extern __ctype] [extern __cwait] [extern __daylight] [extern __dstbias] [extern __dup] [extern __dup2] [extern __ecvt] [extern __endthread] [extern __endthreadex] [extern __environ] [extern __eof] [extern __errno] [extern __except_handler2] [extern __except_handler3] [extern __execl] [extern __execle] [extern __execlp] [extern __execlpe] [extern __execv] [extern __execve] [extern __execvp] [extern __execvpe] [extern __exit] [extern __expand] [extern __fcloseall] [extern __fcvt] [extern __fdopen] [extern __fgetchar] [extern __fgetwchar] [extern __filbuf] [extern __fileinfo] [extern __filelength] [extern __filelengthi64] [extern __fileno] [extern __findclose] [extern __findfirst] [extern __findfirst64] [extern __findfirsti64] [extern __findnext] [extern __findnext64] [extern __findnexti64] [extern __finite] [extern __flsbuf] [extern __flushall] [extern __fmode] [extern __fpclass] [extern __fpieee_flt] [extern __fpreset] [extern __fputchar] [extern __fputwchar] [extern __fsopen] [extern __fstat] [extern __fstat64] [extern __fstati64] [extern __ftime] [extern __ftime64] [extern __ftol] [extern __fullpath] [extern __futime] [extern __futime64] [extern __gcvt] [extern __get_heap_handle] [extern __get_osfhandle] [extern __get_sbh_threshold] [extern __getch] [extern __getche] [extern __getcwd] [extern __getdcwd] [extern __getdiskfree] [extern __getdllprocaddr] [extern __getdrive] [extern __getdrives] [extern __getmaxstdio] [extern __getmbcp] [extern __getpid] [extern __getsystime] [extern __getw] [extern __getws] [extern __global_unwind2] [extern __gmtime64] [extern __heapadd] [extern __heapchk] [extern __heapmin] [extern __heapset] [extern __heapused] [extern __heapwalk] [extern __hypot] [extern __i64toa] [extern __i64tow] [extern __initterm] [extern __inp] [extern __inpd] [extern __inpw] [extern __iob] [extern __isatty] [extern __isctype] [extern __ismbbalnum] [extern __ismbbalpha] [extern __ismbbgraph] [extern __ismbbkalnum] [extern __ismbbkana] [extern __ismbbkprint] [extern __ismbbkpunct] [extern __ismbblead] [extern __ismbbprint] [extern __ismbbpunct] [extern __ismbbtrail] [extern __ismbcalnum] [extern __ismbcalpha] [extern __ismbcdigit] [extern __ismbcgraph] [extern __ismbchira] [extern __ismbckata] [extern __ismbcl0] [extern __ismbcl1] [extern __ismbcl2] [extern __ismbclegal] [extern __ismbclower] [extern __ismbcprint] [extern __ismbcpunct] [extern __ismbcspace] [extern __ismbcsymbol] [extern __ismbcupper] [extern __ismbslead] [extern __ismbstrail] [extern __isnan] [extern __itoa] [extern __itow] [extern __j0] [extern __j1] [extern __jn] [extern __kbhit] [extern __lfind] [extern __loaddll] [extern __local_unwind2] [extern __localtime64] [extern __lock] [extern __locking] [extern __logb] [extern __longjmpex] [extern __lrotl] [extern __lrotr] [extern __lsearch] [extern __lseek] [extern __lseeki64] [extern __ltoa] [extern __ltow] [extern __makepath] [extern __mbbtombc] [extern __mbbtype] [extern __mbcasemap] [extern __mbccpy] [extern __mbcjistojms] [extern __mbcjmstojis] [extern __mbclen] [extern __mbctohira] [extern __mbctokata] [extern __mbctolower] [extern __mbctombb] [extern __mbctoupper] [extern __mbctype] [extern __mbsbtype] [extern __mbscat] [extern __mbschr] [extern __mbscmp] [extern __mbscoll] [extern __mbscpy] [extern __mbscspn] [extern __mbsdec] [extern __mbsdup] [extern __mbsicmp] [extern __mbsicoll] [extern __mbsinc] [extern __mbslen] [extern __mbslwr] [extern __mbsnbcat] [extern __mbsnbcmp] [extern __mbsnbcnt] [extern __mbsnbcoll] [extern __mbsnbcpy] [extern __mbsnbicmp] [extern __mbsnbicoll] [extern __mbsnbset] [extern __mbsncat] [extern __mbsnccnt] [extern __mbsncmp] [extern __mbsncoll] [extern __mbsncpy] [extern __mbsnextc] [extern __mbsnicmp] [extern __mbsnicoll] [extern __mbsninc] [extern __mbsnset] [extern __mbspbrk] [extern __mbsrchr] [extern __mbsrev] [extern __mbsset] [extern __mbsspn] [extern __mbsspnp] [extern __mbsstr] [extern __mbstok] [extern __mbstrlen] [extern __mbsupr] [extern __memccpy] [extern __memicmp] [extern __mkdir] [extern __mktemp] [extern __mktime64] [extern __msize] [extern __nextafter] [extern __onexit] [extern __open] [extern __open_osfhandle] [extern __osplatform] [extern __osver] [extern __outp] [extern __outpd] [extern __outpw] [extern __pclose] [extern __pctype] [extern __pgmptr] [extern __pipe] [extern __popen] [extern __purecall] [extern __putch] [extern __putenv] [extern __putw] [extern __putws] [extern __pwctype] [extern __read] [extern __rmdir] [extern __rmtmp] [extern __rotl] [extern __rotr] [extern __safe_fdiv] [extern __safe_fdivr] [extern __safe_fprem] [extern __safe_fprem1] [extern __scalb] [extern __searchenv] [extern __seh_longjmp_unwind] [extern __set_error_mode] [extern __set_sbh_threshold] [extern __seterrormode] [extern __setjmp] [extern __setjmp3] [extern __setmaxstdio] [extern __setmbcp] [extern __setmode] [extern __setsystime] [extern __sleep] [extern __snprintf] [extern __snwprintf] [extern __sopen] [extern __spawnl] [extern __spawnle] [extern __spawnlp] [extern __spawnlpe] [extern __spawnv] [extern __spawnve] [extern __spawnvp] [extern __spawnvpe] [extern __splitpath] [extern __stat] [extern __stat64] [extern __stati64] [extern __statusfp] [extern __strcmpi] [extern __strdate] [extern __strdup] [extern __strerror] [extern __stricmp] [extern __stricoll] [extern __strlwr] [extern __strncoll] [extern __strnicmp] [extern __strnicoll] [extern __strnset] [extern __strrev] [extern __strset] [extern __strtime] [extern __strupr] [extern __swab] [extern __sys_errlist] [extern __sys_nerr] [extern __tell] [extern __telli64] [extern __tempnam] [extern __time64] [extern __timezone] [extern __tolower] [extern __toupper] [extern __tzname] [extern __tzset] [extern __ui64toa] [extern __ui64tow] [extern __ultoa] [extern __ultow] [extern __umask] [extern __ungetch] [extern __unlink] [extern __unloaddll] [extern __unlock] [extern __utime] [extern __utime64] [extern __vsnprintf] [extern __vsnwprintf] [extern __waccess] [extern __wasctime] [extern __wchdir] [extern __wchmod] [extern __wcmdln] [extern __wcreat] [extern __wcsdup] [extern __wcsicmp] [extern __wcsicoll] [extern __wcslwr] [extern __wcsncoll] [extern __wcsnicmp] [extern __wcsnicoll] [extern __wcsnset] [extern __wcsrev] [extern __wcsset] [extern __wcsupr] [extern __wctime] [extern __wctime64] [extern __wenviron] [extern __wexecl] [extern __wexecle] [extern __wexeclp] [extern __wexeclpe] [extern __wexecv] [extern __wexecve] [extern __wexecvp] [extern __wexecvpe] [extern __wfdopen] [extern __wfindfirst] [extern __wfindfirst64] [extern __wfindfirsti64] [extern __wfindnext] [extern __wfindnext64] [extern __wfindnexti64] [extern __wfopen] [extern __wfreopen] [extern __wfsopen] [extern __wfullpath] [extern __wgetcwd] [extern __wgetdcwd] [extern __wgetenv] [extern __winmajor] [extern __winminor] [extern __winver] [extern __wmakepath] [extern __wmkdir] [extern __wmktemp] [extern __wopen] [extern __wperror] [extern __wpgmptr] [extern __wpopen] [extern __wputenv] [extern __wremove] [extern __wrename] [extern __write] [extern __wrmdir] [extern __wsearchenv] [extern __wsetlocale] [extern __wsopen] [extern __wspawnl] [extern __wspawnle] [extern __wspawnlp] [extern __wspawnlpe] [extern __wspawnv] [extern __wspawnve] [extern __wspawnvp] [extern __wspawnvpe] [extern __wsplitpath] [extern __wstat] [extern __wstat64] [extern __wstati64] [extern __wstrdate] [extern __wstrtime] [extern __wsystem] [extern __wtempnam] [extern __wtmpnam] [extern __wtoi] [extern __wtoi64] [extern __wtol] [extern __wunlink] [extern __wutime] [extern __wutime64] [extern __y0] [extern __y1] [extern __yn] [extern _abort] [extern _abs] [extern _acos] [extern _asctime] [extern _asin] [extern _atan] [extern _atan2] [extern _atexit] [extern _atof] [extern _atoi] [extern _atol] [extern _bsearch] [extern _calloc] [extern _ceil] [extern _clearerr] [extern _clock] [extern _cos] [extern _cosh] [extern _ctime] [extern _difftime] [extern _div] [extern _exit] [extern _exp] [extern _fabs] [extern _fclose] [extern _feof] [extern _ferror] [extern _fflush] [extern _fgetc] [extern _fgetpos] [extern _fgets] [extern _fgetwc] [extern _fgetws] [extern _floor] [extern _fmod] [extern _fopen] [extern _fprintf] [extern _fputc] [extern _fputs] [extern _fputwc] [extern _fputws] [extern _fread] [extern _free] [extern _freopen] [extern _frexp] [extern _fscanf] [extern _fseek] [extern _fsetpos] [extern _ftell] [extern _fwprintf] [extern _fwrite] [extern _fwscanf] [extern _getc] [extern _getchar] [extern _getenv] [extern _gets] [extern _getwc] [extern _getwchar] [extern _gmtime] [extern _is_wctype] [extern _isalnum] [extern _isalpha] [extern _iscntrl] [extern _isdigit] [extern _isgraph] [extern _isleadbyte] [extern _islower] [extern _isprint] [extern _ispunct] [extern _isspace] [extern _isupper] [extern _iswalnum] [extern _iswalpha] [extern _iswascii] [extern _iswcntrl] [extern _iswctype] [extern _iswdigit] [extern _iswgraph] [extern _iswlower] [extern _iswprint] [extern _iswpunct] [extern _iswspace] [extern _iswupper] [extern _iswxdigit] [extern _isxdigit] [extern _labs] [extern _ldexp] [extern _ldiv] [extern _localeconv] [extern _localtime] [extern _log] [extern _log10] [extern _longjmp] [extern _malloc] [extern _mblen] [extern _mbstowcs] [extern _mbtowc] [extern _memchr] [extern _memcmp] [extern _memcpy] [extern _memmove] [extern _memset] [extern _mktime] [extern _modf] [extern _perror] [extern _pow] [extern _printf] [extern _putc] [extern _putchar] [extern _puts] [extern _putwc] [extern _putwchar] [extern _qsort] [extern _raise] [extern _rand] [extern _realloc] [extern _remove] [extern _rename] [extern _rewind] [extern _scanf] [extern _setbuf] [extern _setlocale] [extern _setvbuf] [extern _signal] [extern _sin] [extern _sinh] [extern _sprintf] [extern _sqrt] [extern _srand] [extern _sscanf] [extern _strcat] [extern _strchr] [extern _strcmp] [extern _strcoll] [extern _strcpy] [extern _strcspn] [extern _strerror] [extern _strftime] [extern _strlen] [extern _strncat] [extern _strncmp] [extern _strncpy] [extern _strpbrk] [extern _strrchr] [extern _strspn] [extern _strstr] [extern _strtod] [extern _strtok] [extern _strtol] [extern _strtoul] [extern _strxfrm] [extern _swprintf] [extern _swscanf] [extern _system] [extern _tan] [extern _tanh] [extern _time] [extern _tmpfile] [extern _tmpnam] [extern _tolower] [extern _toupper] [extern _towlower] [extern _towupper] [extern _ungetc] [extern _ungetwc] [extern _vfprintf] [extern _vfwprintf] [extern _vprintf] [extern _vsprintf] [extern _vswprintf] [extern _vwprintf] [extern _wcscat] [extern _wcschr] [extern _wcscmp] [extern _wcscoll] [extern _wcscpy] [extern _wcscspn] [extern _wcsftime] [extern _wcslen] [extern _wcsncat] [extern _wcsncmp] [extern _wcsncpy] [extern _wcspbrk] [extern _wcsrchr] [extern _wcsspn] [extern _wcsstr] [extern _wcstod] [extern _wcstok] [extern _wcstol] [extern _wcstombs] [extern _wcstoul] [extern _wcsxfrm] [extern _wctomb] [extern _wprintf] [extern _wscanf] %endif
;macros.asm %macro InitLocalVars 1 push ebp mov ebp,esp sub esp,%1 %endmacro %macro ClearLocalVars 1 add esp,%1 pop ebp %endmacro ;定义函数开始 %macro def 1-* [section .text] %1: %if %0>1 %assign i 0 %rep %0-1 %xdefine %2 [ebp+8+i*4] %rotate 1 %assign i i+1 %endrep %endif %endmacro ;赋值 ;assign eax,x ;assign eax,addInt_x %macro assign 2 %ifidni %2,eax mov %1,%2 %else %ifidni %1,eax ;%error "eax is 1" mov eax,%2 %else mov eax,%1 mov %2,eax %endif %endif %endmacro ;cdecl 调用 %macro invokeC 1-* %define jtmp %1 %define jcount %0 %if %0>0 %rep %0-1 ;参数旋转,最后一个参数为1 %rotate -1 ;将 %1 参数入栈 push %1 %endrep %endif call jtmp %if jcount>1 add esp,(jcount-1)*4 %endif %endmacro ;stdcall 调用 %macro invokeStdcall 1-* %define jtmp %1 %if %0>0 %rep %0-1 ;参数旋转,最后一个参数为1 %rotate -1 ;将 %1 参数入栈 push %1 %endrep %endif call jtmp %endmacro %macro return 0-1 %if %0==0 ret %else mov eax,%1 ret %endif %endmacro ;打印调试信息,常量 ;trace "hello" %macro traceln 1-2+ jmp %%label %%str: db %1,0x0a,0 %%label: %if %0>1 invokeC _printf, %%str,%2 %else invokeC _printf, %%str %endif %endmacro %macro trace 1-2+ jmp %%label %%str: db %1,0 %%label: %if %0>1 invokeC _printf, %%str,%2 %else invokeC _printf, %%str %endif %endmacro ;allocVar x,4,100 %macro allocVar 2-3 %if %0==2 %ifndef var_offset %xdefine var_offset 0 %xdefine %1 [ebp-var_offset-%2] %xdefine var_offset (var_offset+%2) ;%error %1 %else %xdefine %1 [ebp-var_offset-%2] %xdefine var_offset (var_offset+%2) ;%error %1 %endif %else %ifndef var_offset %xdefine var_offset 0 %else %xdefine var_offset var_offset+%2 %endif %xdefine %1 [ebp-4-var_offset] assign %1,%3 %endif %endmacro ;dest ,src ,1 -> *(char*)dest = *(char*)src %macro assign_content 3 mov edx,%2 %if %3==1 mov al,[edx] mov edx,%1 mov byte [edx],al %elif %3==2 mov ax,[edx] mov edx,%1 mov byte [edx],ax %elif %3==4 mov eax,[edx] mov edx,%1 mov [edx],eax %endif %endmacro %macro increase 1 mov eax,%1 inc eax mov %1,eax %endmacro %macro decrease 1 mov eax,%1 dec eax mov %1,eax %endmacro ;定义函数结束 %macro enddef 0 %endmacro
;bubble.asm %include "include\msvcrt_nasm.inc" ;extern _printf ;extern _exit %include "macros.asm" [section .text] global start global bubble start: invokeC bubble invokeC print_buf invokeC _exit,1 ret bubble: mov ecx,[buf_count] ; n = 10 push ebx ; ebx -> i push esi ; esi -> j mov ebx,1 ; i = 1 loop1: cmp ebx,ecx ; if j>n jge loop_end ; goto loop_end xor esi,esi ; j = 0 loop2: ; mov eax,ecx sub eax,ebx ; eax = n-i cmp esi,eax ; if j>= n-i jge loop2_end ; goto loop2_end lea eax,[buf+esi*4] ;eax = buf+j lea edx,[buf+esi*4+4] ;edx = buf+j+1 mov edi,[edx] ;edi = [buf+j+1] cmp [eax],edi ;if [buf+j]>[buf+j+1] jge jmp_ge ; goto swap loop2_next: ;else inc esi ; j++ jmp loop2 ; goto loop2 jmp_ge: ;swap xchg [eax],edi ;[buf+j] <-> edi mov [edx],edi ;[buf+j+1] = edi jmp loop2_next ; to j++ goto loop2 loop2_end: ;loop2 end inc ebx ;i++ jmp loop1 ;goto loop1 loop_end: ;loop1_end pop esi pop ebx ret ;ret print_buf: push ebx mov ebx,0 ;i=0 p_loop1: mov eax,[buf_count] ; cmp ebx,eax ;if i>=buf_count jge p_loop1_end ; goto p_loop1_end lea eax,[buf+ebx*4] ;[buf+i] trace "%d ",DWORD [eax] ;trace [buf+i] inc ebx ;i++ jmp p_loop1 ;jmp p_loop1 p_loop1_end: pop ebx ret [section .data] buf: dd 25,41,5,98,12,31,33,50,2,1 buf_count: dd ($-buf)/4
相关文章推荐
- 使用YASM编程 - 02
- 使用YASM编程 - 05
- 使用YASM编程 - 03
- 使用YASM编程 - 04
- 使用YASM编程 -07 模拟导入表
- 使用YASM编程 - 01
- 深入解析Python设计模式编程中建造者模式的使用
- shell 编程中使用到得if语句内判断参数
- [编程之美-06]输入一颗二元查找树将该树转换为它的镜像
- Groovy高效编程——‘匕首方法’的使用(更新于2007.09.14)(转载)
- C++ —— 使用模板元编程来进行递归运算的优化
- **JAVA** GUI图形界面编程-Swing的使用
- iOS多线程编程之NSThread的使用
- 有一字符串,包含数字与字母,编程去除数字。要求:1要求在原字符串中操作 2、使用指针处理
- UNIX环境编程学习笔记----unix编程实例----signal使用实例
- vs2013中使用matlab2014b引擎实现c++和matlab混合编程
- 用最少的工具使用树莓派进行编程
- libcurl 使用说明和网页抓取 linux下的curl编程
- [转]使用 Twisted Matrix 框架来进行网络编程 .
- 条款06:若不想使用编译器自动生成的函数,就应该明确拒绝