二、匯編語言常用子程序
1、拆字與拼字:
【例1】將 GR0 中的四位 BCD 碼從高到低依次存放到 GR2 所指的四個(gè)內(nèi)存單元中。
START
LEAGR3,4;循環(huán)計(jì)數(shù)器
L1STGR0,REG;保護(hù)其余幾位 BCD 碼
ANDGR0,C000F;屏蔽高 3 位,留下最低 1 位 BCD 碼
STGR0,3,GR2;將此位 BCD 碼存放到 GR2 所指第四個(gè)內(nèi)存單元
LDGR0,REG;恢復(fù)其余幾位 BCD 碼
SRLGR0,4;將已處理過的此位 BCD 碼移出
LEAGR2.-1,GR2;地址指針減 1
LEAGR3,-1,GR3;循環(huán)計(jì)數(shù)器減 1
JNZL1;未處理完,繼續(xù)
RET
C000FDC#000F ;十六進(jìn)制常數(shù),屏蔽屏蔽高 3 位 BCD 碼用
REGDS1 ;暫存單元
END
【例2】將存放在 GR2 所指的四個(gè)內(nèi)存單元中的四位 BCD 碼依從高到低順序壓縮到 GR0 中 。
START
LEAGR0,0;GR0 清 0
LEAGR3,4;循環(huán)計(jì)數(shù)器
L1SLLGR0,4;將已處理過的 BCD 碼移到高位
LDGR1,0,GR2;GR1 用作臨時(shí)工作寄存器
ANDGR1,C000F;屏蔽高 12 位
STGR1,0,GR2;對內(nèi)存單元中的 BCD 碼預(yù)處理
ADDGR0,0,GR2;將已處理過的此位 BCD 碼加到 GR0 低位
LEAGR2.1,GR2;地址指針指向下一位 BCD 碼
LEAGR3,-1,GR3;循環(huán)計(jì)數(shù)器減 1
JNZL1;未處理完,繼續(xù)
RET
C000FDC#000F ;十六進(jìn)制常數(shù),屏蔽高 12 位二進(jìn)制數(shù)
END
2、數(shù)字與 ASCII 碼之間的相互轉(zhuǎn)換:
十進(jìn)制數(shù)字 0~9 的 ASCII 碼是 30H~39H ,所以只要將十進(jìn)制數(shù)(BCD 碼)加 30H 就是對應(yīng)的 ASCII 碼。
十六進(jìn)制數(shù)轉(zhuǎn)換成 ASCII 碼可分成兩段, 0~9 的 ASCII 碼是 30H~39H ,即加 30H ;A~F 的ASCII 碼是 41H~45H ,即加 37 H。
【例1】將 GR0 中的四位 BCD 碼化成 ASCII 碼從高到低依次存放到字符串變量 STR 中。
START
LEAGR2,3;相對于 STR 首址的地址指針
LEAGR3,4;循環(huán)計(jì)數(shù)器
L1STGR0,REG;保護(hù)其余幾位 BCD 碼
ANDGR0,C000F;屏蔽高 3 位,留下最低 1 位 BCD 碼
ADDGR0,C30;轉(zhuǎn)換成 ASCII 碼
STGR0,STR,GR2;將 ASCII 碼存放到 GR2 所指第四個(gè)內(nèi)存單元
LDGR0,REG;恢復(fù)其余幾位 BCD 碼
SRLGR0,4;將已處理過的此位 BCD 碼移出
LEAGR2.-1,GR2;地址指針減 1
LEAGR3,-1,GR3;循環(huán)計(jì)數(shù)器減 1
JNZL1;未處理完,繼續(xù)
RET
C000FDC#000F ;十六進(jìn)制常數(shù),屏蔽高 3 位 BCD 碼用
C30DC#30 ;十六進(jìn)制常數(shù) 30
STRDS4
REGDS1 ;暫存單元
END
【例2】將 GR0 中的 16 位二進(jìn)制數(shù)化成四位十六進(jìn)制數(shù) ASCII 碼從高到低依次存放到字符串變量 STR 中。
START
LEAGR2,3;相對于 STR 首址的地址指針
LEAGR3,4;循環(huán)計(jì)數(shù)器
L1STGR0,REG;保護(hù)其余幾位二進(jìn)制數(shù)
ANDGR0,C000F;屏蔽高 12 位,留下最低 4 位二進(jìn)制數(shù)
CPLGR0,C0A;< 10 否?
JMIL2;< 10 跳過加 7 ,只加 30H
ADDGR0,C7;≥ 10,加 30H 前先加上 7
L2 ADDGR0,C30;加上 30H
STGR0,STR,GR2;將 ASCII 碼存放到 GR2 所指第四個(gè)內(nèi)存單元
LDGR0,REG;恢復(fù)其余幾位二進(jìn)制數(shù)
SRLGR0,4;將已處理過的此 4 位二進(jìn)制數(shù)移出
LEAGR2.-1,GR2;地址指針減 1
LEAGR3,-1,GR3;循環(huán)計(jì)數(shù)器減 1
JNZL1;未處理完,繼續(xù)
RET
C000FDC#000F ;十六進(jìn)制常數(shù),屏蔽屏蔽高 12 位二進(jìn)制數(shù)
C30DC#30 ;十六進(jìn)制常數(shù) 30
C0ADC#0A ;十六進(jìn)制常數(shù) 0A
C7DC7 ;常數(shù) 7
STRDS4
REGDS1 ;暫存單元
END
【例3】將字符串 STR 中的四位十六進(jìn)制數(shù)的 ASCII 碼化成 16 位二進(jìn)制數(shù)放到 GR0 中 。
START
LEAGR0,0;GR0 清 0
LEAGR2,0;相對于 STR 首址的地址指針
LEAGR3,4;循環(huán)計(jì)數(shù)器
L1SLLGR0,4;將已處理過的十六進(jìn)制數(shù)移到高位
LDGR1,STR,GR2;GR1 用作臨時(shí)工作寄存器
ANDGR1,C00FF;屏蔽高 8 位
SUBGR0,C30;減去30H
CPLGR0,C0A;< 10 否?
JMIL2;< 10 ,完成轉(zhuǎn)換
SUBGR0,C7;≥ 10,再減去 7
L2 STGR1,STR,GR2;將 STR 中的 ASCII 碼轉(zhuǎn)換成十六進(jìn)制數(shù)
ADDGR0,STR,GR2;將此位十六進(jìn)制數(shù)加到 GR0 低位
LEAGR2.1,GR2;地址指針指向下一位 ASCII 碼
LEAGR3,-1,GR3;循環(huán)計(jì)數(shù)器減 1
JNZL1;未處理完,繼續(xù)
RET
C00FFDC#00FF ;十六進(jìn)制常數(shù),屏蔽高 8 位用
C30DC#30 ;十六進(jìn)制常數(shù) 30
C0ADC#0A ;十六進(jìn)制常數(shù) 0A
C7DC7 ;常數(shù) 7
STRDS4
END
3、利用加減法及移位指令做乘法:
1)左移指令可將操作數(shù)乘 2 的整數(shù)次方(2、4、8、16);右移指令可將操作數(shù)除以 2 的整數(shù)次方。
若操作數(shù)是無符號數(shù),用邏輯移位指令;若操作數(shù)是有符號數(shù),用算術(shù)移位指令。
【例1】將 GR0 中的二進(jìn)制數(shù)乘以 8。
SLLGR0,3
【例2】將 GR0 中的帶符號二進(jìn)制數(shù)除以 4。
SRAGR0,2
2)將移位指令和加減法結(jié)合起來可完成乘數(shù)不是 2 的整數(shù)次方的乘法運(yùn)算。
【例1】將 GR0 中的二進(jìn)制數(shù)乘以 10。
START
SLLGR0,1
STGR0,REG
SLLGR0,2
ADDGR0,REG
RET
REGDS1
END
【例2】將 GR0 中的二進(jìn)制數(shù)乘以 7。
START
STGR0,REG
SLLGR0,3
SUBGR0,REG
RET
REGDS1
END
4、二進(jìn)制數(shù)與十進(jìn)制數(shù)的轉(zhuǎn)換
1)二化十:
將二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)的一種常用算法是將被轉(zhuǎn)換的二進(jìn)制數(shù)依次被 10i( 對 16 位二進(jìn)制數(shù),i為 4、3、2、1、0)除,所得的商即為該十進(jìn)制數(shù)位的值,其余數(shù)再被下一個(gè) 10i 除。一般用減法代替除法,即一邊減 10i,一邊計(jì)數(shù)器加 1,直到不夠減再進(jìn)行下一位 10i-1。以求得十進(jìn)制數(shù)的各位數(shù)。
例如:一個(gè)相當(dāng)于十進(jìn)制數(shù) 34635 的二進(jìn)制數(shù),可先用 10000 去減,可減 3 次,得萬位數(shù)是 3;再用 1000 去減,得千位數(shù)是 4;……
【例1】將 GR0 中的二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)的ASCII 碼放入字符串 STR 中。
START
LEAGR1,0;減數(shù)表及字符串指針
LEAGR2,5;循環(huán)計(jì)數(shù)器
L1 LEAGR3,48;該十進(jìn)制位的數(shù)碼預(yù)置 0 的 ASCII 碼
L2LEAGR3,1,GR3;數(shù)碼位的 ASCII 碼加 1
SUBGR0,SNO,GR1;操作數(shù)減去 10i
JPZL2;夠減,繼續(xù)
ADDGR0,SNO,GR1;不夠減,操作數(shù)及數(shù)碼位的 ASCII 碼恢復(fù)
LEAGR3,-1,GR3
STGR3,STR,GR1;轉(zhuǎn)換好的該位 ASCII 碼存入結(jié)果字符串
LEAGR1,1,GR1;地址指針加 1
LEAGR2,-1,GR2;循環(huán)計(jì)數(shù)器減 1
JNZL1;未結(jié)束,繼續(xù)下一位
RET
SNODC10000
DC1000
DC100
DC10
DC1
STRDS5 ;轉(zhuǎn)換結(jié)果字符串
END
1)十化二:
將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的算法基礎(chǔ)是下面公式:
N = (Dn-1*10n-1+Dn-2*10n-2+……+D1*101+D0*100
= ((…((Dn-1*10+Dn-2)*10+……+D1)*10+D0)*10
可以用循環(huán)程序?qū)崿F(xiàn)此公式,*10 可用移位及加法指令完成。
【例2】將存放在字符串 STR 中的五位十進(jìn)制數(shù)(<65536)的 ASCII 碼轉(zhuǎn)換成二進(jìn)制數(shù)放到 GR0 中 。
START
LEAGR0,0;轉(zhuǎn)換結(jié)果寄存器清 0
LEAGR2,5;循環(huán)計(jì)數(shù)器
LEAGR1,0;地址指針(偏移量)
L1 SLLGR0,1;轉(zhuǎn)換結(jié)果*10,先乘以 2
STGR0,REG;暫存 2*X
SLLGR0,2;2*X*4=8*X
ADDGR0,REG;8*X + 2*X
LDGR3,STR,GR1;取一位 ASCII 碼
ANDGR3,C000F;將 ASCII 碼變成 BCD 碼
STGR3,REG;結(jié)果暫存
ADDGR0,REG;將新的一位 BCD 碼加到轉(zhuǎn)換結(jié)果中
LEAGR1,1,GR1;地址指針加 1
LEAGR2,-1,GR2;循環(huán)計(jì)數(shù)器減 1
JNZL1;未結(jié)束,繼續(xù)下一位
RET
C000FDC#000F ;十六進(jìn)制常數(shù),屏蔽高 12 位二進(jìn)制數(shù)
STRDC’35475’
REGDS1;暫存單元
END
5、求累加和
【例1】將變量 NUMBER 中的 5 個(gè)二進(jìn)制數(shù)累加后放入變量 SUM 中。
START
LEAGR2,NUMBER;地址指針
LEAGR3,5;循環(huán)計(jì)數(shù)器
LEAGR0,0;累加和清 0
L1ADDGR0,0,GR2;累加
LEAGR2,1,GR2;地址指針指向下一個(gè)二進(jìn)制數(shù)
LEAGR3,-1,GR3;計(jì)數(shù)器減 1
JNZL1;未完,繼續(xù)
STGR0,SUM;累加結(jié)束,累加和送入 SUM 單元
RET
NUMBERDS5
SUMDS1
END
轉(zhuǎn)帖于:軟件水平考試_考試吧