2011-03-09 66 views
1

我工作的一些組件的功課,我難倒我的最後一個程序。如果任何具有x86彙編知識的人都潛伏着,請隨時評論我如何開始使用它。謝謝!反向陣列的內容彙編

問題

使用循環用間接或變址尋址扭轉的整數數組中的元素代替。不要將元素複製到任何其他數組。還可以使用SIZEOF,TYPE和LENGTHOF運算符使程序對不同的數組更靈活。到目前爲止

代碼:(?)

.data 
array BYTE 10h,20h, 30h, 40h 

.code 
main PROC 
    call Clrscr 

     ;no clue... 

    exit 
main ENDP 

END main 
+1

也許從思考如何用一種更熟悉的語言開始。 – 2011-03-09 20:45:53

+1

用C語言編寫答案,然後編譯爲彙編程序並將其爵士化,看起來就像您自己輸入的那樣。 :D – 2011-03-10 13:39:28

+0

真棒用戶名哈哈。 – darko 2011-03-10 22:08:54

回答

1

好,點開始ESI和與EDI結束陣列的,加載2 ..元素,交換它們然後相應地改變ESI和EDI和重複,直到....提示:你沒有掉任何東西,因爲你在組裝是= P

+0

@downvoters:護理解釋你downvote – BlackBear 2011-03-10 13:35:40

+0

說不上誰投下來雅。 Upvote from me to counterteract it.Thanks for answers!謝謝回答! – darko 2011-03-10 22:08:23

+0

@馬特:笑沒問題:) – BlackBear 2011-03-11 18:08:37

0

一家親會使用特殊字符串的指令和源和目標寄存器;但這可能看起來像是你欺騙了你的作業。

以下是你可以用它來實現自己的目標基本memonics:

  • MOV目的地源

    MOV EAX,串負荷數組的地址到EAX

    MOV EDX,[ eax]將eax指向的值載入edx

  • INC eax將eax中的值增加1

  • OR EAX,EAX(這個參數設置零標誌,如果EAX爲零)

  • JZ標籤(跳轉如果零標誌被設置爲標籤)

的標籤是由設置添加一個冒號「:」像label:

+0

帶*號的特殊字符串的指令*你指的是MOVS *?我聽說他們是陳舊過時 – BlackBear 2011-03-09 21:14:02

+1

如在現代管道可能肆虐,但仍然讓優雅和簡單的解決方案。 – 2011-03-10 11:51:55

+0

不是在談論MOVS。使用R/ESX和R/EDX討論**微代碼**。此外:這根本不是問題或我的答案。 – 2011-03-10 12:07:39

1

我不是真的好,組裝等等可能存在更好的答案(這一個工程)。

TITLE Reversing an array without using oneother array 
INCLUDE Irvine32.inc 

.data 
    array1 DWORD 10d,20d,30d,40d,50d,60d,70d,80d,90d 
.code 
main PROC 
     mov ESI, OFFSET array1 ;ESI now points to the first item of array1 
     mov EDI, SIZEOF array1 
     add EDI, OFFSET array1 
     sub EDI, TYPE array1 ;EDI now points to the last item of array1 

     mov ECX, LENGTHOF array1 
     shr ECX, 1   ;now ecx is half the length of the array1 
L1:  mov EAX, [ESI]   ;in this loop we reverse the items of the array 
     mov EBX, [EDI] 
     mov [EDI],EAX 
     mov [ESI],EBX 
     add ESI, TYPE array1 
     sub EDI, TYPE array1 
     LOOP L1 

     mov ECX, LENGTHOF array1;here we just print the array 
     mov ESI, OFFSET array1 
L2:  MOV EAX, [ESI] 
     call WriteInt 
     call Crlf 
     add ESI, TYPE array1 
     LOOP L2 
     exit   
main ENDP 
END main 
+0

是的,除非你不需要[慢'loop'指令](https://stackoverflow.com/questions/35742570/why-is-the-loop-instruction-slow-couldnt-intel-have-implemented-它高效地)。只要'cmp esi,edi' /'jb L1'在開始指針低於結束指針時循環。指針設置也可以更簡單:或者在數組末尾放置一個標籤,或者將'mov edi,OFFSET array1 + SIZEOF array1 - TYPE array1'放在彙編類型中進行所有計算。 – 2017-11-14 18:51:53