emu8086列印等腰三角形

2021-09-08 12:33:32 字數 3167 閱讀 6009

三角形的列印可以借助emu8086.inc,這個庫里有一些封裝好的函式便於我們使用。比如gotoxy可以讓我們定位到螢幕上要顯示字元的地方,然後通過putc來顯示字元。

先定義兩個變數分別儲存行和列座標,然後用gotoxy col,row來定位座標,然後通過迴圈來顯示*,迴圈的次數通過更改cx暫存器的值來改變。然後就可以用下面的方式來產生三角形了。

gotoxy col,row  

mov cx, 1

c1:    putc '*'

loop c1      

add row,1 

sub col,1

gotoxy col,row  

mov cx, 3

c2:    putc '*'

loop c2  

add row,1 

sub col,1

gotoxy col,row  

mov cx, 5

c3:    putc '*'

loop c3

可以看到上面的**有很多重複的地方,我們可以考慮使用迴圈來對**進行優化。這裡需要注意,在列印*的時候已經使用了乙個迴圈,如果在外面再套乙個迴圈,cx暫存器的使用就存在衝突。這裡需要用到壓棧操作,在進入內層迴圈之前,先將cx暫存器的值存起來,等內層迴圈執行完畢,再把剛才存的值返還給cx,這樣兩個迴圈就不會衝突了。**如下:

mov cx, 5

c:    push cx

gotoxy col,row  

mov cx, num

c1:putc '*'

loop c1      

add row,1 

sub col,1

add num,2

pop cx

loop c

可以看到現在**比之前簡潔了很多,這裡一共定義了三個變數,除了行和列,還定義了乙個num,用來表示每次要列印幾個*,這個值每執行一次自加2,用於設定下一次列印*的個數。

如果要改變三角形的位置,更改col和row的初始值即可;如果要改變三角形的大小,更改外層迴圈的次數即可。

需要注意定義變數不能放在程式開頭,這樣編譯器會將其翻譯成別的指令,為了防止出現這樣的錯誤,有兩種解決方案,一是將變數定義放在ret的後面;二是依然放在開頭,但是在程式第一句加乙個jmp指令,跳轉到變數定義完畢的後面。

在需要定位螢幕輸入位置的時候,呼叫gotoxy加座標即可,那我們是否也可以構造乙個函式,我們只需要輸入三角形頂點的位置和三角形的大小就可以畫出想要的三角形呢?答案是肯定的。

我們可以在剛才的**基礎上修改,將其依賴的引數從外部傳入,定義函式的方法可以參考emu8086.inc這個庫。對於用到的gotoxy和putc,我們可以將其原始碼抄寫過來放到我們的函式中,最終構建的函式如下所示:

******** macro x y n     

jmp cc 

col db x   

row db y

num dw 1  

cc:mov cx, n

c:    push cx

push    ax

push    bx

push    dx

mov    ah, 02h

mov    dh, row

mov    dl, col

mov    bh, 0

int     10h

pop     dx

pop     bx

pop     ax 

mov cx, num

c1:push   ax

mov    al, '*'

mov    ah, 0eh

int     10h    

pop     ax

loop c1      

sub col,1 

add row,1

add num,2

pop cx

loop c

對於上面的**,還是可以進行優化的,我們是將x的值賦給col,col又將其賦給dl,如果將x直接送給dl,就不用定義col這個變數了。對於row,num也是一樣的。接下來我們嘗試將變數定義去掉,直接對暫存器進行操作。

我們用ax暫存器來頂替num的作用,在開始的地方給ax賦初值,然後在迴圈中讓ax自加即可。剛開始需要給dh dl暫存器賦值來定義起始點,直接用傳入引數賦值即可,然後在迴圈內讓dh和dl暫存器自加或自減來改變座標。

通過閱讀gotoxy的**發現其在函式進入和退出的時候進行了壓棧和出棧操作,是因為其內部對有些暫存器進行了操作,為了不影響這些暫存器本來的值,要對其原本的值進行保護。這裡我們也參考它的做法,對我們修改的暫存器進行保護。

最終完成**如下:

******** macro x y n  

push dx

push cx

push ax

mov dh, y

mov dl, x

mov cx, n

mov ax, 1

c: push cx

push ax

push bx

mov ah, 02h

mov bh, 0

int 10h

pop bx

pop ax

mov cx, ax

c1:push ax

mov al, '*'

mov ah, 0eh

int 10h

pop ax

loop c1

sub dl,1

add dh,1

add ax,2

pop cx

loop c

pop ax

pop cx

pop dx

endm

org 100h

******** 6,1,5

ret

end

實驗效果如下:

列印等腰三角形(1)

要列印的樣式 源 public class for7 內迴圈輸出 for int j 1 j 2 i 1 j system.out.println 解析 外迴圈不再多說,第乙個內迴圈是輸出前邊的空格,應該能看懂吧,好吧再說一下 當i 1 即第一行 時,j 1,j 5,說明 j 要迴圈四次,並輸出四個...

等腰三角形的列印

列印出乙個等腰三角形。思路很容易 雙重for迴圈處理。難點在於如何控制等腰,讓圖形像個金字塔,可以想象乙個矩形挖成等腰三角形 package com.math.forth 列印出乙個等腰三角形。思路很容易 雙重for迴圈處理。難點在於如何控制等腰,讓圖形像個金字塔 author wql public...

藍橋杯 等腰三角形

本題目要求你在控制台輸出乙個由數字組成的等腰三角形。具體的步驟是 先用1,2,3,的自然數拼乙個足夠長的串 用這個串填充三角形的三條邊。從上方頂點開始,逆時針填充。比如,當三角形高度是8時 輸入 輸入存在多組資料,對於每組資料 輸入一行包含乙個正整數n 3輸出 對於每組測試資料輸出用數字填充的等腰三...