masm

时间:2015-04-30 02:53:43

标签: sorting assembly x86 masm

我有一个我正在研究的程序。尝试在Visual Studio 2010中使用MASM在程序集中进行选择排序,我遇到了问题。每当我改变条件以从降序排序到升序时,程序给出错误的答案。我正在尝试纠正这个我有代码,但我也有我想要转换的另一种语言的选择排序代码。该语言是网站上的C ++。我想知道如何使用min作为汇编中数组的索引来翻译语句。我等了两天。我需要帮助的人。我还在研究算法。这是代码:

.386
.model flat,stdcall
.stack 100h

printf proto c arg1:ptr byte, printlist:vararg

.data
printmessage db "Selection Sort",0
fmtmsg1 db "%d",0
fmtmsg2 db 0dh,0ah,0

array dword 9,4,6,8,1,0
arraylength dword 5

temp dword ?
min dword ?


.code
public main
main proc
     ;invoke printf,addr fmtmsg1,addr printmessage
     ;invoke printf,addr fmtmsg2

     mov esi,offset array
     mov ecx,0   ; outerloop
     mov edx,0   ; innerloop

     mov edx,ecx ; innerloop for loop condition variables 

innerloop:
     mov ebx,5
     sub ebx,1  ; outerloop for loop condition variables

     add edx,1  ; innerloop for loop condition variables
     cmp edx,5
     jge outerloop

     mov eax,[esi]     ;9   9,4,6,8,1,0
     cmp eax,[esi + 4] ;4
     Jge noexchange
     mov min,edx

     cmp min,ecx
     je noexchange

      ;exchange values   
      xchg eax,[esi + 4]        
      mov [esi],eax     

noexchange:
      add esi,4           
      jmp innerloop

outerloop:
     mov esi,offset array
     mov edx,0  ; reset innerloop counter

     inc ecx
     cmp ecx,ebx
     jne innerloop


    mov esi,offset array

loop3:
     mov eax,[esi]
     push edx
     invoke printf,addr fmtmsg1,eax
     pop edx

     add esi,4
     inc edx
     cmp edx,5
     jne loop3

     ret
main endp
end main

C ++代码我试图理解如何使用最小值作为MASM中数组的索引。

以下是我正在使用的代码:

void selectionSort(int arr[], int n) {
      int i, j, minIndex, tmp;    
      for (i = 0; i < n - 1; i++) 
      {
            minIndex = i;
            for (j = i + 1; j < n; j++)
                  if (arr[j] < arr[minIndex])
                        minIndex = j;

            if (minIndex != i) 
            {
                  tmp = arr[i];
                  arr[i] = arr[minIndex];
                  arr[minIndex] = tmp;
            }
      }
}

1 个答案:

答案 0 :(得分:1)

我试过但我无法修复汇编代码,因此我将您的C ++算法直接转换为Visual Studio 2010 C ++控制台项目中的汇编。重要的是:

  • 我代替i,j和minIndex,分别使用ESI,EDI和EBX。
  • 因为数组项(数字)长4个字节,所以i ++是#34;添加ESI,4&#34 ;, j ++是&#34;添加EDI,4&#34;。
  • 两个循环(fori和forj)需要&#34; n&#34;知道结局。因为我使用反向计数器,所以必须使用两个&#34; n&#34;,每个用一个&#34;用于&#34; (&#34; ni&#34; for&#34; fori&#34;,&#34; nj&#34; for&#34; forj&#34;)。

以下是代码:

foreach (string PortName in System.IO.Ports.SerialPort.GetPortNames())
{
    PortBox.Items.Add(PortName);
}