2013-04-18 111 views
0

我有一個項目,我想輸入一個數字,說我進入3,它可以讓你的輸出,如何在裝配中反轉和修改我的字符串?

ZYX**XYZ 

ZY****YZ 

Z******Z 

和一個5會給你

ZYXWV**VWXYZ 

ZYXW****WXYZ 

ZYX******XYZ 

ZY********YZ 

Z**********Z 

在項目中,我不要以爲我的教練會允許我使用數組,或者至少現在還沒有,但這裏是我的想法。

我正在考慮爲數字做一個字符串,所以說我得到一個3.我會產生ZYX *,並簡單地將其扭轉以獲得另一半的三角形。唯一的問題是,我不知道如何將這些字母逐個更改爲星星。我正在考慮使用循環來做到這一點,但不知道如何去做。我只知道下一個字符串是ZY **,然後簡單地將其顛倒。

不要誤解我的意思,我並不是要求所有人都爲我做,但也許會給我一些提示或提示如何接近它。謝謝。

到目前爲止,感謝大家,我已經能夠想出這個。

TITLE MASM Template      (main.asm) 

; Description: 
; 
; Revision date: 

INCLUDE Irvine32.inc 

.data 
x  DWORD ? 
msg  BYTE "Please input a number: " ,0dh,0ah,0 

.code 
;crlf 
main PROC 
    call Clrscr 

    MOV  edx, OFFSET msg   ; Moves message to input number into register 
    call WriteString   ; Displays message on screen to prompt user to input number 
    call readInt    ; Take the number that the user inputs 
    MOV  x,eax     ; Store it into x 
    MOV  ecx, eax    ; For the loop counter 
    MOV  al, 'Z'     ; Move Z to the register 

L2: 
    MOV  al, 'Z'    ; Resets al to z for loop 

L1:       ; Start of the loop with label L1 
    call WriteChar   ; To write the letters 
    ;call crlf    ; To put in 'enter' 
    SUB  al, 1    ; To Move the next char going downward 
    LOOP L1 

    MOV  al, ' ' 
    call WriteChar 
    MOV  ecx, x     ; Resets ecx for outside loop 
    SUB  x, 1     ; Decrements x for counter 

    call crlf     ; To be tidy  
    LOOP L2 

    exit 
main ENDP 
END main 

現在我只需要另一邊。

+0

我在這裏看不到任何代碼,所以我認爲你是完全新裝配。你可能想從一個簡單的hello世界程序開始。 「...使用陣列」意味着什麼?一個字符串是一個數組,對嗎?無論如何,在彙編中它只是一塊內存,除非你把你的字符串放入一個或多個寄存器。 – nrz 2013-04-18 07:51:15

回答

1

歡迎來到最黑暗的黑色電腦藝術 - 彙編!

讓我們從彙編程序員的角度來看這個問題。

你有一個數字,讓我們說BL(因爲這是一個很好的彙編名稱),你想要做的是產生BL線的輸出。假設BL = 5

現在,CX作爲計數器寄存器非常好,所以如果我們將BL複製到CL並通過將它與自身異或來清除CH,我們也有CX =#行。

我們必須扭轉之前打印的字符數爲方便比這個多,所以我們可以增加CX - 這是一個重要的數字,所以它保存在說,BP

每行由字母'Z'降至('Z' - BH + 1),另一個星號,然後相同,並換行。並且每一行都會減少一個打印的字母數,並將一個星號加上一個星號。

爲了生產一條線,我們最好

  • 負載寄存器 - 比如說,DL,而 'Z'(DL因爲它的方便, 輸出一個 'printme' 例程)
  • 複製那麼到另一個寄存器,比如說BH(寄存器到寄存器的移動速度是 快,比負載立即小)
  • 從BH減去BL,產生一個魔術值,'Z' - 5 ='U' - 是有 鐘聲響了嗎?

我們想打印一個字母數,所以如果我們將BP複製到CX中,那應該是有用的。
下面是我們想要做的CX時代的東西:

  • 寫出來的字在DL - 與一捻。
  • 變化通過減小在DL字符它

然後,我們需要輸出另一個BP字節,所以sopy BP以CX再次
下面是我們想要做的CX時代的東西:

  • 寫DL中的角色 - 扭曲。
  • 變化通過遞增

然後發送CR和LF

所以在DL性格 - 有什麼扭曲?

那麼,如果在DL字符小於或等於BH的性格,我們要與Asterisk如果DL在堆棧上替換一個星號,所以

  • 保存DX
  • 負載DL < = BH
  • 輸出DL
  • 將DX從堆棧中彈回,恢復其值,然後我們用 替換星號。

完成該行 - 遞減BL中的行數;如果結果不爲零,則生成另一行

  • 如果它爲零,我們都完成了。

這裏需要注意的是,通過遞減BL中的行數,從生產線程序開始時的DL減去的數量遞減,所以'改變爲aster'值變爲'V',' W'...

現在讓我們徹底糾結。

你會注意到,這兩個寫CX-字符程序之間的唯一區別是,一個遞減和其他增量DL ...

讓我們設置SI到0FFFFH,DI 1我們開始之前,只爲一笑。

現在 - DH正在爲整場比賽坐在板凳上。

假設我們編寫例程以打印CX字符,以便將SI添加到DX。這將給我們第一次在循環中需要的減量。

  • 當循環結束時,假設我們有EXCHANGE DI和SI。
  • 循環運行的下一次,它將INCREMENT DX,然後再次交換SI 和DI。

很有用,呵呵?

哦,當我們扭曲時,我們可以通過使用它來存儲DL而不是推動DX並將其彈回來,從而讓DH參與其中。將DL移到DH,測試替換aster,寫出並從DH恢復DL。

所以 - 這個套路的一點是,它不依賴於存儲串...

0

我寫了一篇關於如何創建一個pyramid of characters的教程。它使用NASM和Windows API而不是Irvine,但該教程應該能夠幫助你在物流方面有所幫助。