首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

.问2段<显示字符串>的程序,对代码不太明白.该怎么处理

2012-03-23 
.....问2段显示字符串的程序,对代码不太明白...------------------------------------显示AL中的数字

.....问2段<显示字符串>的程序,对代码不太明白...
;   ------------------------------------
;   显示   AL   中的数字
;   默认地:
;数字已经存在   AL   中
;edi   始终指向要显示的下一个字符的位置
;   被改变的寄存器:
;ax,   edi
;   ------------------------------------
DispAL:
pushecx
pushedx

movah,   0Ch;   0000:   黑底         1100:   红字
movdl,   al
shral,   4
movecx,   2
.begin:
andal,   01111b
cmpal,   9
ja.1
addal,   '0 '
jmp.2
.1:
subal,   0Ah
addal,   'A '
.2:
mov[gs:edi],   ax
addedi,   2

moval,   dl
loop.begin
addedi,   2

popedx
popecx

ret
;   DispAL   结束-------------------------


gs指向显存

;   ------------------------------------
DispReturn:
pusheax
pushebx
moveax,   edi
movbl,   160
divbl
andeax,   0FFh     ;   为什么要用ADD????
inceax
movbl,   160
mulbl
movedi,   eax
popebx
popeax

ret
;   DispReturn   结束---------------------



[解决办法]
andeax, 0FFh ; 为什么要用ADD????

不是ADD,而是AND,目的是去处显存地址中的高字,保留低字,因为AL中存放的是商,AH中存放的是余数。下面还有用这个“(商+1)*160” 来计算换行后的首字符地址。不过这个换行过程存在隐患,当过程的入口参数edi的实际值大于65536时,此过程将不再能正常工作!因为这个过程假设edi的低字有效。
[解决办法]
al是八位寄存器,可以存储2个16进制位,例如AL=5F。
andal, 01111b 执行后al=0F。

下面的判断是:
if(al> 9)
al=al+31 ;转化为字母(F)为ASCII码
else
al=al+30 ;转化数字为ASCII码

subal, 0Ah
addal, 'A '
就等于
add al,31

mov[gs:edi], ax; 写入显存
addedi, 2 ; 移动显存指针

movdl, al ;目的是保持AL的低半字节

第一次执行循环体前shral, 4是为了先转化高半字节

自己好好研究一下

热点排行