⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 languages.asm

📁 一个演示了用汇编语言编写的数据排序算法,源代码非常详细
💻 ASM
📖 第 1 页 / 共 2 页
字号:
      invoke SetMenuItemInfo, hMENU_Options, IDMI_DELETEALL, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_DELETESEL
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_DELETESELECTED, FALSE, OFFSET MII
      invoke SetMenuItemInfo, hMENU_ItemOptions, IDMI_DELETESELECTED, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_ALGORITHM
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_ALGORITHM, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_ELEMENTS
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_ELEMENTS, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_COMPARISONS
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_CMPCOUNTER, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_EXCHANGES
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_MOVCOUNTER, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_TIME
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_TIME, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_MEMORY
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_MEMORY, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_DATA
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_DATA, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_INITVALUE
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_INITVALUE, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_COPYALL
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_COPYALL, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_COPYSEL
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_COPYSELECTED, FALSE, OFFSET MII
      invoke SetMenuItemInfo, hMENU_ItemOptions, IDMI_COPYSELECTED, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_SAVEALL
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_SAVEALL, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_SAVESEL
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_SAVESELECTED, FALSE, OFFSET MII
      invoke SetMenuItemInfo, hMENU_ItemOptions, IDMI_SAVESELECTED, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_INCLUDEHEADERS
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_INCLUDEHEADERS, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_DIVTABULATOR
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_TABSEPARATOR, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_DIVSEMICOLON
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMI_SEMISEPARATOR, FALSE, OFFSET MII

      mov    eax, lpSTR_PMENU_COPYSAVE
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMP_COPYSAVE, FALSE, OFFSET MII

      mov    eax, lpSTR_PMENU_COLUMNS
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options, IDMP_COLUMNS, FALSE, OFFSET MII


  .ELSEIF eax == IDD_GRAPHIC
      ;-----------------------------------------------------------------------------------
      ;-- Dialog: Graphic

      ;-----------------------------------------------------------------------------------
      ;-- Delete all status bar texts if the sorting process is not running.
      .IF !SortInfo.fSorting
          invoke SendMessage, hGraphicDialog_SB, SB_SETTEXT, SB_PART_ALGORITHM, NULL
          invoke SendMessage, hGraphicDialog_SB, SB_SETTEXT, SB_PART_CMPCOUNTER, NULL
          invoke SendMessage, hGraphicDialog_SB, SB_SETTEXT, SB_PART_MOVCOUNTER, NULL
      .ENDIF


      ;-----------------------------------------------------------------------------------
      ;-- Change the texts of the static controls.
      invoke SendDlgItemMessage, hDialogGraphic, IDDI_S_ALGORITHM, WM_SETTEXT, NULL, lpSTR_S_ALGORITHMS2
      invoke SendDlgItemMessage, hDialogGraphic, IDDI_S_DATA2, WM_SETTEXT, NULL, lpSTR_S_DATA
      invoke SendDlgItemMessage, hDialogGraphic, IDDI_S_ELEMENTS2, WM_SETTEXT, NULL, lpSTR_S_ELEMENTS
      invoke SendDlgItemMessage, hDialogGraphic, IDDI_S_DELAY, WM_SETTEXT, NULL, lpSTR_S_DELAY
      invoke SendDlgItemMessage, hDialogGraphic, IDDI_S_INITVALUE2, WM_SETTEXT, NULL, lpSTR_S_INITVALUE


      ;-----------------------------------------------------------------------------------
      ;-- Change the texts of the buttons.
      invoke SendMessage, hGraphicDialog_B_Generate, WM_SETTEXT, NULL, lpSTR_B_GENERATE
      invoke SendMessage, hGraphicDialog_B_Options2, WM_SETTEXT, NULL, lpSTR_B_OPTIONS

      .IF SortInfo.fSorting && SortInfo.fGraphic
          mov    eax, lpSTR_B_CANCEL
      .ELSE
          mov    eax, lpSTR_B_SORT
      .ENDIF
      invoke SendMessage, hGraphicDialog_B_Start, WM_SETTEXT, NULL, eax


      ;-----------------------------------------------------------------------------------
      ;-- Change the item texts of the data combo box.

        ;---------------------------------------------------------------------------------
        ;-- Get the index of the selected item.
        invoke SendMessage, hGraphicDialog_CB_Data, CB_GETCURSEL, NULL, NULL
        push   eax
        
        
        ;---------------------------------------------------------------------------------
        ;-- Delete all items.
        invoke SendMessage, hGraphicDialog_CB_Data, CB_RESETCONTENT, NULL, NULL


        ;---------------------------------------------------------------------------------
        ;-- Insert the items.
        invoke SendMessage, hGraphicDialog_CB_Data, CB_ADDSTRING, NULL, lpSTR_UNSORTED
        invoke SendMessage, hGraphicDialog_CB_Data, CB_ADDSTRING, NULL, lpSTR_SORTEDASC
        invoke SendMessage, hGraphicDialog_CB_Data, CB_ADDSTRING, NULL, lpSTR_SORTEDDESC


        ;---------------------------------------------------------------------------------
        ;-- Select the previous selected item again.
        pop    eax
        invoke SendMessage, hGraphicDialog_CB_Data, CB_SETCURSEL, eax, NULL


      ;-----------------------------------------------------------------------------------
      ;-- Change the item texts of the delay combo box (position).
      
        ;---------------------------------------------------------------------------------
        ;-- Get the index of the selected item.
        invoke SendMessage, hGraphicDialog_CB_DelayPos, CB_GETCURSEL, NULL, NULL
        push   eax
        
        
        ;---------------------------------------------------------------------------------
        ;-- Delete all items.
        invoke SendMessage, hGraphicDialog_CB_DelayPos, CB_RESETCONTENT, NULL, NULL


        ;---------------------------------------------------------------------------------
        ;-- Insert the items.
        invoke SendMessage, hGraphicDialog_CB_DelayPos, CB_ADDSTRING, NULL, lpSTR_CBI_EACHPASS
        invoke SendMessage, hGraphicDialog_CB_DelayPos, CB_ADDSTRING, NULL, lpSTR_CBI_EACHCOMPARISON
        invoke SendMessage, hGraphicDialog_CB_DelayPos, CB_ADDSTRING, NULL, lpSTR_CBI_EACHEXCHANGE


        ;---------------------------------------------------------------------------------
        ;-- Select the previous selected item again.
        pop    eax
        invoke SendMessage, hGraphicDialog_CB_DelayPos, CB_SETCURSEL, eax, NULL


      ;-----------------------------------------------------------------------------------
      ;-- Fill the delay combo box (number of milliseconds).

        ;---------------------------------------------------------------------------------
        ;-- Get the index of the selected item.
        invoke SendMessage, hGraphicDialog_CB_Delay, CB_GETCURSEL, NULL, NULL
        push   eax


        ;---------------------------------------------------------------------------------
        ;-- Delete all items.
        invoke SendMessage, hGraphicDialog_CB_Delay, CB_RESETCONTENT, NULL, NULL


        ;---------------------------------------------------------------------------------
        ;-- Insert the items.
        mov    eax, OFFSET AllowedDelays

      @@:
          push   eax

            ;-----------------------------------------------------------------------------
            ;-- Get a number, convert it to an ASCII-string and add an item.
            mov    ebx, DWORD PTR [eax]
            invoke dwtoa, ebx, OFFSET Buffer
            invoke szCatStr, OFFSET Buffer, lpSTR_MS
            invoke SendMessage, hGraphicDialog_CB_Delay, CB_ADDSTRING, NULL, OFFSET Buffer

          pop    eax

          add    eax, 4
          cmp    DWORD PTR [eax], -1
          jnz    @B


        ;---------------------------------------------------------------------------------
        ;-- Select the previous selected item again.
        pop    eax
        invoke SendMessage, hGraphicDialog_CB_Delay, CB_SETCURSEL, eax, NULL


      ;-----------------------------------------------------------------------------------
      ;-- Change the item texts of the menu. 
      mov    MII.cbSize, SIZEOF MII
      mov    MII.fMask, MIIM_STRING
      mov    MII.fType, MFT_STRING

      mov    eax, lpSTR_MENUI_LINES
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options2, IDMI_LINES, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_POINTS
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options2, IDMI_POINTS, FALSE, OFFSET MII

      mov    eax, lpSTR_MENUI_SAVEASBITMAP
      mov    MII.dwTypeData, eax
      invoke SetMenuItemInfo, hMENU_Options2, IDMI_SAVEASBITMAP, FALSE, OFFSET MII

  .ENDIF


@Return:
	ret
LoadLanguageStrings ENDP



;-----------------------------------------------------------------------------------------
; Purpose:     Fills an array with offsets of the strings of an specified language.
;
; Inputs:      lpLangStrings - pointer to the first language string of a language. 
;              lpOffsets - pointer to the array that shall be filled.
;
; Outputs:     none
;
; Notes:       Each string has to be terminated by a NULL-byte, whereas the last string 
;              has to be terminated by two NULL-bytes.
;-----------------------------------------------------------------------------------------

LoadOffsets PROC USES eax ebx ecx dx lpLangStrings:DWORD, lpOffsets:DWORD

  mov    eax, lpLangStrings
  mov    ebx, lpOffsets
  mov    ecx, 0

  ;---------------------------------------------------------------------------------------
  ;-- Copy the offset of the first string to the array.
  mov    DWORD PTR [ebx], eax

  dec    eax

@NextChar:
  ;---------------------------------------------------------------------------------------
  ;-- Is the current char NULL?
  inc    eax
  mov    dl, BYTE PTR [eax]
  test   dl, dl
  jnz    @NextChar                                ;-- No. Check the next char.


  ;---------------------------------------------------------------------------------------
  ;-- Yes. Have all strings been processed?
  cmp    ecx, COUNT_LANG_STRINGS
  jnb    @Return                                  ;-- Yes. -> return.


  ;---------------------------------------------------------------------------------------
  ;-- No. Is the next byte NULL?
  cmp    BYTE PTR [eax + 1], NULL
  jz     @Return                                  ;-- Yes. The last string was processed.
                                                  ;-- -> return.


  ;---------------------------------------------------------------------------------------
  ;-- No. A new String begins here. Increment the offset, the string counter and the
  ;-- offset of the array and copy th string offset to the array.
  inc    eax
  inc    ecx
  add    ebx, 4
  mov    DWORD PTR [ebx], eax

  jmp    @NextChar                                ;-- Process the next char.


@Return:
  ret
LoadOffsets ENDP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -