使用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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
http://www.linuxfromscratch.org/blfs/view/svn/general/yasm.html Introduction to yasm Yasm is a complete rewrite of the NASM-2.14.02 assembler. It supports the x86 and AMD64 instruction sets, accepts NASM and GAS assembler syntaxes and outputs binary, ELF32 and ELF64 object formats. This package is known to build and work properly using an LFS-9.1 platform. Package Information Download (HTTP): http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz Download MD5 sum: fc9e586751ff789b34b1f21d572d96af Download size: 1.5 MB Estimated disk space required: 27 MB (additional 12 MB for the tests) Estimated build time: 0.1 SBU (additional 0.1 SBU for the tests) yasm Dependencies Optional Python-2.7.18 and Cython User Notes: http://wiki.linuxfromscratch.org/blfs/wiki/yasm Installation of yasm Install yasm by running the following commands: sed -i 's#) ytasm.*#)#' Makefile.in && ./configure --prefix=/usr && make To test the results, issue: make check. Now, as the root user: make install Command Explanations sed -i 's#) ytasm.*#)#' Makefile.in: This sed prevents it compiling 2 programs (vsyasm and ytasm) that are only of use on Microsoft Windows. Contents Installed Program: yasm Installed Library: libyasm.a Installed Directory: /usr/include/libyasm Short Descriptions yasm is a portable, retargetable assembler that supports the x86 and AMD64 instruction sets, accepts NASM and GAS assembler syntaxes and outputs binaries in ELF32 and ELF64 object formats. libyasm.a provides all of the core functionality of yasm, for manipulating machine instructions and object file constructs.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值