最近跟小鱼学汇编,做10实验的时候,出了个问题,请大神指点
assume cs:code,ds:datadata segment
db 'welcome',0
data ends
code segment
start: mov dh,1
mov dl,64H
mov cl,42H
mov ax,data
mov ds,ax ;指向字符串数据段
mov ax,0b800H
mov es,ax ;指向显存位置数据
mov si,0 ;si数据段偏移
mov di,0 ;di显存位置偏移
call show_str
mov ax,4c00H
int 21H
show_str:mov bx,0
mov ax,0
mov al,dh ;把输入的行数赋予ax
mov bx,0a0H ;把一行160个字节的数据赋予bx
mul bx ;相乘等到数赋予ax,偏移最大到25行,所以没超出寄存器
mov bl,dl
mov bh,0 ;把列数赋予bx
add bx,bx ;应为列为两个字节一列所以加上
add ax,bx ;把列和行加上,就是显存偏移
mov di,ax ;把值赋予di(显存偏移位置)
mov ah,cl ;把颜色值赋予ah
s:mov cx,ds: ;判断字符中0的出现
mov ch,0
jcxz ok
mov al,ds: ;把字符赋予al
mov es:,ax ;把ax赋予显存位置
inc si
add di,2 ;高位放属性,低位放字符,所以要移动2位
loop s
ok:ret
code ends
end start
刚才发帖错误,,这个才是,,列那一行没反应,,显示出来的总是第一个位置,行号的改变没问题,,颜色也没问,请各大神帮我纠正纠正,,谢谢
我直接在后面,,mov es:,ax ;把ax赋予显存位置 在di处,,改为就可以使列改变,,但用变量,,用di,,啊,等等去赋值,就概不了??求解 我下载了答案来对照,发现了mul哪里搞错了,,谢谢
我都还没看呢,你比我牛逼 show_str:mov bx,0
mov ax,0
mov al,dh ;把输入的行数赋予ax
mov bx,0a0H ;把一行160个字节的数据赋予bx
mul bx ;相乘等到数赋予ax,偏移最大到25行,所以没超出寄存器
将后两句改为 mov bl,0a0H ;把一行160个字节的数据赋予bx
mul bl
因为用 mul bx 的话,与AX 的乘积存放在 DX:AX 中,这里DX为0,造成dl 的值被清0,
列值的设定就不起作用了。 lenovolty 谢谢你的讲解,{:7_148:} 就是说,,用mov bx,oaoH,mul bx,,因为除数寄存器是16位的,所以就当成了被除数是32位来计算了,,dx用了存放余数了,,所以dl给覆盖了,,改为bl那就是除数是8位,是16位计算,不用用到dx,dl就不会给覆盖dl就能起作用了,是这样理解的吧?我的理解没错吧
页:
[1]