解释一下汇编小程序

解释一下汇编小程序,第1张

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,长度计数用也就是初始化为-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”的要求。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12426237.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存