实验十第一题的一个问题
assume cs:code,ds:data,ss:stackdata segment
db 'welcome to masm!',0
data ends
stack segment
dw 8 dup (0)
stack ends
code segment
start: mov dh, 8h ;显示的行号
mov dl, 3h ;显示的列号
mov cl, 2h ;显示的颜色
mov ax, data ;将DATA定义数据段
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 16
mov si, 0
call show_str
mov ax, 4c00h
int 21h
show_str: mov ax, 0b800h
mov es, ax
mov al, 160 ;计算行偏移字节数
sub dh, 1
mul dh
mov di, ax ;将行偏移字数给DI
mov al, 2 ;计算列偏移字节数
mul dl
sub ax, 2
add di, ax ;计算显存偏移地址
mov bl, cl ;显示的颜色给BL
mov cl, ;将DATA的第一个字符给CL
mov ch, 0 ;给CH一个零
s: jcxz s1
mov es:, cl
mov es:, bl
add di, 2
inc si
mov cl,
mov ch, 0
jmp short s 此处若改为LOOP S后就乱码或者没有什么都不显示。LOOP 只是将CX减一,用DEBUG调试时发现CX的内空没有写入显存,这是为什么?我搞不明白,希望高手们能帮我解决疑问。我是个初学者,在这里感谢各位
code ends
end start
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!',0
data ends
stack segment
dw 8 dup (0)
stack ends
code segment
start:
mov dh, 8h ;显示的行号
mov dl, 3h ;显示的列号
mov cl, 2h ;显示的颜色
mov ax, data ;将DATA定义数据段
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 16
mov si, 0
call show_str
mov ax, 4c00h
int 21h
show_str: mov ax, 0b800h
mov es, ax
mov al, 160 ;计算行偏移字节数
sub dh, 1
mul dh
mov di, ax ;将行偏移字数给DI
mov al, 2 ;计算列偏移字节数
mul dl
sub ax, 2
add di, ax ;计算显存偏移地址
mov bl, cl ;显示的颜色给BL
mov cl, ;将DATA的第一个字符给CL
mov ch, 0 ;给CH一个零
s: jcxz s1
mov es:, cl
mov es:, bl
add di, 2
inc si
mov cl,
mov ch, 0
jmp short s ;loop会将cx减一,而cl又放字符 ,这会使你无法知道loop什么时候终止(我个人不建议用cl放字符)
s1:ret ; 少了返回
code ends
end start
非常感谢!我明白了,LOOP会先将CX减一,才跳转。若CX为零时,会使CX的值变为FFFF
页:
[1]