解释一下汇编小程序

来源:百度知道 编辑:UC知道 时间:2024/06/30 22:18:20
这是一个在小窗口上显示信息的函数,麻烦逐条解释一下,把状态说清楚一些,是什么意思~结果是什么~thx
void WriteAt(BYTE X, BYTE Y,char *Str, BYTE Colour)
{
BYTE Length=StrLen(Str);

asm{
mov ax,0B800h
mov es,ax
mov al,X
mov dl,80
mul dl
mov dh,0
mov dl,Y
add ax,dx
shl ax,1
shl dx,1
mov di,ax
mov ah,Colour
mov si,Str
mov cl,Length
mov ch,0
}
write:
asm{
mov al,[si]
mov es:[di],ax
add di,2
inc si
loop write
}
}

short StrLen(const char *Str)
{
asm{
mov bx,word ptr[bp+4]
xor si,si
dec si
}
length:
asm{
inc si

asm{
mov ax,0B800h
mov es,ax //设置显存的段0b800:0000h
mov al,X //
mov dl,80 //
mul dl //ax = 80 * X //每行80个字符,所以
mov dh,0
mov dl,Y //dx = y
add ax,dx // ax = ax + Y//这个时候ax是计算出来要显示位置
在内存中的偏移量
//比如 第三行,第4个字,,内存中的便宜是
// 3*80+4 = 244位置,,

//因为要显示字符,每个字符占用2个字节位置
//高位为颜色,低位为显示的字符,所以两个都要 * 2
shl ax,1 // ax = ax *2
shl dx,1 // dx = dx * 2
mov di,ax // di = ax
//所以这个时候的di才是真正的内存中的偏移量
////////////////////////
mov ah,Colour//ah = 颜色,上面说了高位是颜色,所以这里设置
mov si,Str //si=str的地址
mov cl,Length
mov ch,0//cx=长度//后面循环次数根据这个长度来,,loop指令和cx配合用的
}
write:
asm{
mov al,[si] //al = 要显示的字符
mov es:[di],ax //显示字符,带颜色
add di,2 //偏移量 + 2
inc si //显示的字符地址+1
loop write //循环写,,
}

short StrLen(const char *Str)
{
asm{
mov bx,word ptr[bp+4] //获得str的地址给bx
xor si,si//si= 0;
dec si//si= si - 1,长度计数用也就是初始