panzhen 发表于 2020-11-13 18:25:04

实验十 无法显示结果

代码如下:检查了没找到有问题,可是不显示结果,跟我是64位系统有关系吗。但是最下面的程序却显示,怎么回事呢。

assume cs:code,ds:data

data segment
    db 'Welcome to masm!',0
data ends

code segment
start:      mov dh,8
            mov dl,3
            mov cl,2
            mov ax,data
            mov ds,ax
            mov si,0
            call show_str

            mov ax,4c00h
            int 21h

show_str:   push cx
            push bp
            push bx

            mov bl,cl   ;存颜色
            mov bh,0

            mov ax,0b800h
            mov es,ax
            mov bp,0

            mov al,0ah   ;确认行数
            dec dh
            mul dh
            mov bp,ax

            mov dh,0    ;确认列数
            dec dl
            add dl,dl
            add bp,dx

s:          mov cl,
            mov ch,0
            jcxz ok
            ;mov al,cl
                  mov byte ptr es:,cl
            ;mov ah,bl
                  mov byte ptr es:,bl
            inc si
            add di,2
            loop s

ok:         pop bx
            pop bp
            pop cx
            ret

code ends
end start



这是实验9,这个可以显示出来

assume cs:codesg,ds:datasg

datasg segment
        db 'welcome to masm!'
datasg ends

codesg segment
start:        mov ax,datasg
                mov ds,ax
                mov ax,0b800h
                mov es,ax
                mov si,0720h
                mov bx,0

                mov cx,16

s:                mov al,byte ptr
                mov byte ptr es:,al
                mov ah,2
                mov byte ptr es:,ah

      mov byte ptr es:,al
      mov ah,36
                mov byte ptr es:,ah

      mov byte ptr es:,al
      mov ah,113
      mov byte ptr es:,ah

                inc bx
                add si,2
                loop s

                mov ax,4c00h
                int 21h
codesg ends

end start

“或许” 发表于 2020-11-13 19:52:15

loop s
cx没设定
建议 用jump 指令

xieglt 发表于 2020-11-13 21:03:32

di 没有初始值

wtchou 发表于 2020-11-13 23:54:55

本帖最后由 wtchou 于 2020-11-14 09:32 编辑

assume cs:code,ds:data

data segment
    db 'Welcome to masm!',0
data ends

code segment
start:      mov dh,8
            mov dl,3
            mov cl,2
            mov ax,data
            mov ds,ax
            mov si,0
            call show_str

            mov ax,4c00h
            int 21h

show_str:   push cx
            push bp
            push bx

            mov bl,cl   ;存颜色
            mov bh,0

            mov ax,0b800h
            mov es,ax
            mov bp,0

            mov al,0a0h   ;确认行数
            dec dh
            mul dh
            mov bp,ax

            mov dh,0    ;确认列数
            dec dl
            add dl,dl
            add bp,dx

s:          mov cl,
            mov ch,0
            jcxz ok
            ;mov al,cl
                  mov byte ptr es:,cl
            ;mov ah,bl
                  mov byte ptr es:,bl
            inc si
            add di,2
            loop s

ok:         pop bx
            pop bp
            pop cx
            ret

code ends
end start

-----------------------------------------------------------------------

修改红色部分, 即可正常执行
不过如同 2, 3 楼大大们所述
loop s 应改用 jmp
di 应设初始值
才是较正确的思路

如下:

assume cs:code,ds:data

data segment
    db 'Welcome to masm!',0
data ends

code segment
start:      mov dh,8
            mov dl,3
            mov cl,2
            mov ax,data
            mov ds,ax
            mov si,0
            call show_str

            mov ax,4c00h
            int 21h

show_str:   push cx
            push bp
            push bx

            mov bl,cl   ;存颜色
            mov bh,0

            mov ax,0b800h
            mov es,ax
            mov bp,0

            mov al,0a0h   ;确认行数
            dec dh
            mul dh
            mov bp,ax

            mov dh,0    ;确认列数
            dec dl
            add dl,dl
            add bp,dx

            mov di, 0
s:          mov cl,
            mov ch,0
            jcxz ok
            ;mov al,cl
                  mov byte ptr es:,cl
            ;mov ah,bl
                  mov byte ptr es:,bl
            inc si
            add di,2
            jmp short s

ok:         pop bx
            pop bp
            pop cx
            ret

code ends
end start

panzhen 发表于 2020-11-14 17:02:03

本帖最后由 panzhen 于 2020-11-14 17:07 编辑

“或许” 发表于 2020-11-13 19:52
cx没设定
建议 用jump 指令

            mov cx,0
            mov di,0
s:          mov cl,
            mov ch,0
            jcxz ok

这个意思吗,还是不显示,哦知道怎么回事了,如四楼所说,还是自己写错了

panzhen 发表于 2020-11-14 17:09:23

嗯,之前写的JMP,后来改成LOOP了
di设初值也是没发现,给忘了。
但是CX不用了吧,
mov cl,
mov ch,0
这两行不就算定义了。
页: [1]
查看完整版本: 实验十 无法显示结果