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