群益电脑 发表于 2012-5-8 17:27:41

实验十第一题的一个问题

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 S后就乱码或者没有什么都不显示。LOOP 只是将CX减一,用DEBUG调试时发现CX的内空没有写入显存,这是为什么?我搞不明白,希望高手们能帮我解决疑问。我是个初学者,在这里感谢各位


code ends
end start

hxs554f 发表于 2012-5-8 21:12:30

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

群益电脑 发表于 2012-5-9 09:56:03

非常感谢!我明白了,LOOP会先将CX减一,才跳转。若CX为零时,会使CX的值变为FFFF
页: [1]
查看完整版本: 实验十第一题的一个问题