读书人

.问2段lt;显示字符串gt;的程序,对代码不太

发布时间: 2012-03-23 12:06:21 作者: rapoo

.....问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是为了先转化高半字节

自己好好研究一下

读书人网 >汇编语言

热点推荐