【ARM汇编】打印金字塔 | 打印倒三角
??作者簡(jiǎn)介:大家好我是湯姆凱特,大家可以叫我湯姆
🐋個(gè)人主頁:IM湯姆凱特的CSDN博客
🎁系列專欄:【ARM嵌入式基礎(chǔ)】
🌱每日一句:
沒有人是無所不知的,知識(shí)真正能帶給我們的無非是:不害怕未知。
文章目錄
- 寫在前面:
- 如何用匯編打印金字塔?
- 效果圖:
- 1)確定格式串
- 2)偽代碼
- 3)構(gòu)建大循環(huán)框架
- 4)構(gòu)建兩個(gè)小循環(huán)
- 如何用匯編打印倒三角?
- 變化一
- 變化二
- 變換三
- 打印倒三角整體匯編代碼
- 結(jié)果顯示:
寫在前面:
匯編的循環(huán)和分支語句學(xué)完之后,來做一個(gè)小練習(xí),如何用循環(huán)打印一個(gè)金字塔?如何打印一個(gè)倒三角?那下面講解如何實(shí)現(xiàn)和需要注意的要點(diǎn)。
如何用匯編打印金字塔?
效果圖:
1)確定格式串
🍎如圖,可以看出打印輸出的內(nèi)容分別有“空格”、“*”、“換行”,所以需要先定義好打印輸出的格式串。
.datastr:.asciz " "str1:.asciz "*"crlf:.asciz "\n"2)偽代碼
🍏整個(gè)程序的設(shè)計(jì)包含一個(gè)大一點(diǎn)的循環(huán)控制層數(shù),兩個(gè)內(nèi)部的循環(huán)控制打印輸出“空格”還是“*” 。
3)構(gòu)建大循環(huán)框架
🍊因?yàn)閷?shí)現(xiàn)的要求比較單一,只需要打印,不需要輸入等操作,所以循環(huán)的層數(shù)就可以事先定義好。
🍋每執(zhí)行一行r4+1,當(dāng)執(zhí)行的次數(shù)超出8時(shí),不滿足LS,則不進(jìn)行跳轉(zhuǎn),程序結(jié)束。
.datastr:.asciz " "str1:.asciz "*"crlf:.asciz "\n".equ n,8 //金字塔的層數(shù) .text .globl mainmain:push {lr}ldr r0,=crlf //空出首行bl printf mov r4,#1 //r4存放層數(shù)循環(huán)的控制變量b for1 l1: ......add r4,#1 for1:cmp r4,#nbls l1 //ls 無符號(hào)數(shù)的小于等于mov r0,#0pop {lr}mov pc,lr .end4)構(gòu)建兩個(gè)小循環(huán)
沒一行只需要有打印“空格”和“*”兩種模式,所以需要構(gòu)建兩個(gè)循環(huán)。
循環(huán)的關(guān)鍵在于循環(huán)的次數(shù)和執(zhí)行的內(nèi)容,每一行需要打印的“空格”和“*”的個(gè)數(shù)不同,所以循環(huán)打印次數(shù)就是關(guān)鍵。
🍒看上述圖片,可以看出*號(hào)滿足一個(gè)規(guī)律“n×2-1”,n表示層數(shù)。所以我們可以用兩行指令來表達(dá)
mov r5,r4,lsl#1 //邏輯左移,相當(dāng)于r4*2然后再傳給r5sub r5,#1🍇也可以發(fā)現(xiàn)每行要打印的空格數(shù)是依次減1,那么我們可以先給空行附一個(gè)初始值s=20,然后將這個(gè)循環(huán)做成一個(gè)s-1的循環(huán)即可,但是又需要固定循環(huán)的層數(shù),所以可以直接讓s-r4即可,r4就是我們每一層的層數(shù)。
rsb r5,r4,#s //逆向減法指令🍉這樣就把兩個(gè)循環(huán)的次數(shù)問題解決了。內(nèi)部循環(huán)的代碼如下:
l1: rsb r5,r4,#s b for2 l21:ldr r0,=str bl printfsub r5,#1 for2:cmp r5,#0bhi l21mov r5,r4,lsl#1 sub r5,#1b for3 l22:ldr r0,=str1 bl printfsub r5,#1 for3:cmp r5,#0bhi l22ldr r0,=crlf bl printfadd r4,#1如何用匯編打印倒三角?
跟打印金字塔的核心思想不變,整體框架也不變,改變的就是需要打印“空格”和“*”的次數(shù)不同。需要改變的有以下幾點(diǎn)。
變化一
🍑在s-r4的前面需要初始化r4,r4的初始值必須是最大值,即層數(shù)n
mov r4,#n變化二
🍈那從最大值開始,就不能是遞增循環(huán)了,需要改成遞減循環(huán)
sub r4,#1變換三
🍌在停止循環(huán)的控制語句中,需要改成當(dāng)r4的值大于0時(shí)一直循環(huán),HI表示無符號(hào)數(shù)大于。
cmp r4,#0 //必須用0不能用1,因?yàn)橄旅媸谴笥?#xff0c;如果用#1,r4減到1之后就直接結(jié)束了,最后1次沒有執(zhí)行。bhi l1打印倒三角整體匯編代碼
.datastr:.asciz " "str1:.asciz "*"crlf:.asciz "\n".equ n,8.equ s,20 .text .globl mainmain:push {lr}ldr r0,=crlf bl printf mov r4,#nb for1 l1: rsb r5,r4,#s //逆向減法指令b for2 l21:ldr r0,=str bl printfsub r5,#1 for2:cmp r5,#0bhi l21mov r5,r4,lsl#1 //邏輯左移,相當(dāng)于r4*2然后再傳給r5sub r5,#1b for3 l22:ldr r0,=str1 bl printfsub r5,#1 for3:cmp r5,#0bhi l22ldr r0,=crlf bl printfsub r4,#1 for1:cmp r4,#0 //必須用0不能用1,因?yàn)橄旅媸谴笥?#xff0c;如果用#1,r4減到1之后就直接結(jié)束了,最后1次沒有執(zhí)行。bhi l1mov r0,#0pop {lr}mov pc,lr .end結(jié)果顯示:
本期就結(jié)束了,如果對(duì)您有幫助,點(diǎn)贊+評(píng)論支持一下博主再走吧 還沒有關(guān)注湯姆的朋友,點(diǎn)個(gè)關(guān)注每天學(xué)一點(diǎn)匯編 下期預(yù)告: ARM匯編n的階乘求解
總結(jié)
以上是生活随笔為你收集整理的【ARM汇编】打印金字塔 | 打印倒三角的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POWER BI:SSAS表格建模(转自
- 下一篇: java button属性设置_java