我们写汇编程序的时候,往往无法基于汇编代码的思考,只能使用类C语言的方式来进行编程。于是就要从C语言->最细伪代码->用寄存器替代为机器理解代码。
现在以起泡法举例。

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,eaxmov %1,%2
    %else
        %ifidni %1,eax;%error "eax is 1"mov eax,%2
        %elsemov eax,%1mov %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
    %endifcall jtmp
    %if jcount>1add 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
    %endifcall jtmp
%endmacro

%macro return 0-1
    %if %0==0ret
    %elsemov eax,%1ret
    %endif
%endmacro
;打印调试信息,常量
;trace "hello"
%macro traceln 1-2+jmp  %%label
    %%str: db %1,0x0a,0
    %%label:
    %if %0>1invokeC _printf, %%str,%2
    %elseinvokeC _printf, %%str
    %endif
%endmacro
%macro trace 1-2+jmp  %%label
    %%str: db %1,0
    %%label:
    %if %0>1invokeC _printf, %%str,%2
    %elseinvokeC _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 3mov edx,%2
    %if %3==1mov al,[edx]mov edx,%1mov byte [edx],al
    %elif %3==2mov ax,[edx]mov edx,%1mov byte [edx],ax
    %elif %3==4mov eax,[edx]mov edx,%1mov [edx],eax
    %endif
%endmacro

%macro increase 1mov eax,%1inc eaxmov %1,eax
%endmacro
%macro decrease 1mov eax,%1dec eaxmov %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 bubbleinvokeC print_bufinvokeC _exit,1ret
bubble:mov  ecx,[buf_count]     ; n = 10push ebx                 ; ebx -> ipush esi                 ; esi -> jmov ebx,1                ; i = 1loop1:cmp ebx,ecx          ; if j>njge loop_end         ; goto loop_endxor esi,esi          ; j = 0loop2:               ;mov eax,ecxsub eax,ebx          ; eax = n-icmp esi,eax          ; if j>= n-ijge loop2_end        ; goto loop2_endlea eax,[buf+esi*4]   ;eax = buf+jlea edx,[buf+esi*4+4] ;edx = buf+j+1mov edi,[edx]         ;edi = [buf+j+1]cmp [eax],edi         ;if [buf+j]>[buf+j+1]jge jmp_ge            ; goto swaploop2_next:           ;elseinc esi           ; j++jmp loop2         ; goto loop2jmp_ge:               ;swapxchg [eax],edi    ;[buf+j] <-> edimov [edx],edi     ;[buf+j+1] = edijmp loop2_next    ; to j++ goto loop2loop2_end:            ;loop2 endinc ebx           ;i++jmp loop1             ;goto loop1loop_end:                 ;loop1_endpop esipop ebxret                   ;retprint_buf:push ebxmov ebx,0                 ;i=0
p_loop1:mov eax,[buf_count]       ;cmp ebx,eax               ;if i>=buf_countjge p_loop1_end           ; goto p_loop1_endlea 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 ebxret
[section .data]buf: dd 25,41,5,98,12,31,33,50,2,1buf_count: dd ($-buf)/4

使用YASM编程 - 06相关推荐

  1. 并发编程-06线程安全性之可见性 (synchronized + volatile)

    文章目录 线程安全性文章索引 脑图 可见性定义 导致不可见的原因 可见性 -synchronized (既保证原子性又保证可见性) 可见性 - volatile(但不保证操作的原子性) volatil ...

  2. 使用YASM编程 - 01

    YASM 继承了NASM ,扩展了支持的语法和平台 支持INTEL 格式语法和 GNU AS 语法 下面是一个例子,实现了简单的invoke 调用和编程的一个基本的框架 它能够: 0 win32 程序 ...

  3. Java并发编程(06):Lock机制下API用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Lock体系结构 1.基础接口简介 Lock加锁相关结构中涉及两个使用广泛的基础API:ReentrantLock类和Condition接 ...

  4. c语言编程 0-6的数字对应星期,输入一个数字0~6 用中英文显示星期几 如何用vb编程...

    满意答案 stivr 推荐于 2017.09.28 采纳率:41%    等级:12 已帮助:28014人 新建VB工程,添加一个Text1和一个Command1,然后复制以下代码: Private ...

  5. 好课堂用Scratch编程06 趣学篇(二)热身中的卡卡

    卡卡在工作人员的引导下穿上游戏特制的装备. "游戏中,您注意一下画外音,AI助手会给您提供一些提示信息". "好的,谢谢啦!" 卡卡进入虚拟世界,眼前飘过一连串 ...

  6. 实战并发编程 - 06线程在执行过程中的状态是如何流转的

    文章目录 线程的生命周期 线程的状态流转图 线程各个状态说明 NEW(初始化状态) RUNNABLE(就绪,运行中状态) RUNNING 运行中状态 BLOCKED(阻塞状态) WAITING(等待状 ...

  7. 【JUC并发编程06】多线程锁 (公平锁和非公平锁,死锁,可重锁)

    文章目录 6 多线程锁 (公平锁和非公平锁,死锁,可重锁) 6.1 synchronized 锁的八种情况 6.2 对上述例子的总结 6.3 公平锁和非公平锁 6.4 可重入锁 6.5 死锁 6 多线 ...

  8. a标签href不跳转_[网页编程]-06 HTML5 超链接标签

    超链接的作用实际上就是为实现页面跳转功能以及锚点功能(跳转到当前页面的顶部和尾部或设定的位置) 测试代码 <!DOCTYPE html> <html><head>& ...

  9. Linux高级编程--06.进程概述

    进程控制块 在Linux中,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,它通常包含如下信息: 进程id.系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非 ...

  10. Linux系统编程06 --进程间关系

    文章目录 六.进程间关系 终端 **tty** 网络终端 进程组 会话 setsid()创建新会话函数 getsid()获取会话sid函数 守护进程 守护进程创建步骤 六.进程间关系 终端 ​ 在UN ...

最新文章

  1. 非常可乐(杭州电子科技大学第四届大学生程序设计竞赛)(九度2013年教程87题)
  2. SQL优化避免索引失效
  3. arduino黑线循迹小车程序_循迹小车:给我一条线,我能自己走完全程
  4. 计算机安全靠,市计算机:网络安全进校园,网络安全靠人人
  5. 【LiveVideoStack线上分享】WebAssembly在Web多媒体领域的相关实践
  6. luajit表记录监控(忆一次项目上线中遇到的luajit对象内存泄漏)
  7. .Net程序员面试 中级篇 (回答Scott Hanselman的问题)
  8. 全志A33-gpio驱动程序
  9. 我的WCF之旅(4):WCF中的序列化[下篇]
  10. dept在Java里面_EmpDeptManager 在JavaEE环境下搭建三大框架体系实现员工的增删改查系统 Develop 261万源代码下载- www.pudn.com...
  11. CUDA、MPI和SU混编,MakeFile文件的编写
  12. 远程监督在关系抽取中的应用
  13. java8—Stream
  14. 编程到底难在哪里?—— 《人月神话》阅读分享
  15. vue-tippy优秀悬浮框插件的两种使用方式(解决elementui的tooltip不及时消失及定位出错问题,使用el-progress进度条模仿柱状图,tippy模仿echarts悬浮框)
  16. WordPress-Tony极简免费单栏博客主题
  17. pta基础编程题目集 7-1 厘米换算英尺英寸
  18. 2017中兴算法挑战赛(迪杰斯特拉)
  19. Android CameraServer:Disconnect
  20. 微信小程序定时器及延迟

热门文章

  1. 【总结整理】openlayer加载搜狗地图,qq地图,mapabc
  2. 阿里云视频点播 和HLS加密解密
  3. java 格式化金额_java格式化金额 java格式数字 保留2位小数
  4. java 排序sort_Java排序方法sort的使用详解(转)
  5. Unity打开外部文件夹并选择文件
  6. w10打游戏老是弹出计算机,有效解决win10玩游戏弹出输入法的问题
  7. ThinkPHP5实验室预约管理系统
  8. 制作Thinkpad五合一WIN7光盘(只要两个小步骤,并附$OEM$资料包下载)
  9. 计算机英语用哪个软件,电脑学习英语的软件哪个好?
  10. 浅谈 malloc 函数在单片机上的应用