鱼C论坛

 找回密码
 立即注册
查看: 2604|回复: 5

[已解决]实验十 无法显示结果

[复制链接]
发表于 2020-11-13 18:25:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下:检查了没找到有问题,可是不显示结果,跟我是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,[si]
            mov ch,0
            jcxz ok
            ;mov al,cl
                    mov byte ptr es:[bp+di],cl
            ;mov ah,bl
                    mov byte ptr es:[bp+1+di],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 [bx]
                mov byte ptr es:[si],al
                mov ah,2
                mov byte ptr es:[si+1],ah

        mov byte ptr es:[si+0A0H],al
        mov ah,36
                mov byte ptr es:[si+0A0H+1],ah

        mov byte ptr es:[si+0A0H+0A0H],al
        mov ah,113
        mov byte ptr es:[si+0A0H+0A0H+1],ah

                inc bx
                add si,2
                loop s

                mov ax,4c00h
                int 21h
codesg ends

end start
最佳答案
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,[si]
            mov ch,0
            jcxz ok
            ;mov al,cl
                    mov byte ptr es:[bp+di],cl
            ;mov ah,bl
                    mov byte ptr es:[bp+1+di],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,[si]
            mov ch,0
            jcxz ok
            ;mov al,cl
                    mov byte ptr es:[bp+di],cl
            ;mov ah,bl
                    mov byte ptr es:[bp+1+di],bl
            inc si
            add di,2
            jmp short s

ok:         pop bx
            pop bp
            pop cx
            ret

code ends
end start

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-13 19:52:15 | 显示全部楼层
loop s

cx没设定
建议 用jump 指令
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-13 21:03:32 | 显示全部楼层
di 没有初始值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,[si]
            mov ch,0
            jcxz ok
            ;mov al,cl
                    mov byte ptr es:[bp+di],cl
            ;mov ah,bl
                    mov byte ptr es:[bp+1+di],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,[si]
            mov ch,0
            jcxz ok
            ;mov al,cl
                    mov byte ptr es:[bp+di],cl
            ;mov ah,bl
                    mov byte ptr es:[bp+1+di],bl
            inc si
            add di,2
            jmp short s

ok:         pop bx
            pop bp
            pop cx
            ret

code ends
end start

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 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,[si]
            mov ch,0
            jcxz ok

这个意思吗,还是不显示,哦知道怎么回事了,如四楼所说,还是自己写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-14 17:09:23 | 显示全部楼层
嗯,之前写的JMP,后来改成LOOP了
di设初值也是没发现,给忘了。
但是CX不用了吧,
mov cl,[si]
mov ch,0
这两行不就算定义了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-29 04:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表