
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,长度计数用也就是初始化为-1,因为后面是先加1的
}
length:
asm{
inc si//长度计数 + 1
cmp byte ptr[bx+si],0 //比较是不是等于字符串结束即0
jne length //不是结束符,跳回到length再来
mov cx,si//吧长度给cx,,最后用cx返回的.
}
return _CX
}
这个是对CMP AL,[DI]这句话执行后的ZF标志位的判断。如果找到了第一个非“A”字符,则LOOPE不满足,不会跳转到NEXT,继续执行下面的MOV BX,DI,然后跳转到结束,因为此时已经找到盯银丛了第一个非"A"字符。BX指向非‘A’字符。
假凯樱如这段搏唤字符串找完后还没有找个非“A”字符,即此时CX为0,LOOPE不满足,执行下面的MOV BX,DI,然后判断ZF(这个ZF是由CMP AL,[DI]计算出来的),ZF=0,JNE跳转不满足,继续执行下面的MOV BX,-1 ,即实现了“找不到BX=-1”的要求。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)