使用YASM编程 - 06

我们写汇编程序的时候,往往无法基于汇编代码的思考,只能使用类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,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

猜你喜欢

转载自blog.csdn.net/justin_bkdrong/article/details/77948258
06