鱼C论坛

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

[已解决]实验十(按需求行列 显示颜色字符

[复制链接]
发表于 2021-3-27 18:49:13 | 显示全部楼层 |阅读模式

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

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

x
请问逻辑哪错了呀。  为啥隔着字母显示

这是我的代码
assume cs:code,ss:stack,ds:data

data segment
db'welcome to masm ',0
data ends

stack segment

dw 16 dup(0)

stack ends

code segment
start:
     mov ax,data
     mov ds,ax
     mov ax,stack
     mov ss,ax
     
     mov dh,8
     mov dl,3
     mov cl,2
     mov si,0
     mov ax,0b800h
     mov es,ax;显示基地指
     
 
     
     call show_str
      mov ax,4c00h
      int 21h


show_str:
         mov al,160
         mov ah,dh
         mul ah
         mov bx,ax
         mov ah,0
         mov al,2
         mul dl;一个字符2b 列
         add bx,ax;列行实际地址
         mov al,cl;颜色储存在al

colour:
      ;检查字符串结束
      mov ch,0
      mov cl,[si]
      jcxz ok


    
   mov ah,[si]
   mov es:[bx+si],ah
   mov es:[bx+si].1,al
   inc si
   jmp short colour

       
         

ok:  
   ret 

code ends
end start

最佳答案
2021-3-27 23:03:48
assume cs:code,ss:stack,ds:data

data segment
db'welcome to masm ',0
data ends

stack segment

dw 16 dup(0)

stack ends

code segment
start:
     mov ax,data
     mov ds,ax
     mov ax,stack
     mov ss,ax
     
     mov dh,8
     mov dl,3
     mov cl,2
     mov si,0
     mov ax,0b800h
     mov es,ax;显示基地指
     

     
     call show_str
      mov ax,4c00h
      int 21h


show_str:
         mov al,160
         mov ah,dh
         mul ah
         mov bx,ax
         mov ah,0
         mov al,2
         mul dl;一个字符2b 列
         add bx,ax;列行实际地址
         mov al,cl;颜色储存在al

colour:
      ;检查字符串结束
      mov ch,0
      mov cl,[si]
      jcxz ok


   
   mov ah,[si]
   mov es:[bx],ah
   mov es:[bx].1,al
   add bx, 2
   inc si
   jmp short colour

      
         

ok:  
   ret

code ends
end start


改红色部分
截屏2021-03-27 下午6.46.46.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-27 18:50:34 | 显示全部楼层
dh存放要求行 dl列
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-27 23:03:48 | 显示全部楼层    本楼为最佳答案   
assume cs:code,ss:stack,ds:data

data segment
db'welcome to masm ',0
data ends

stack segment

dw 16 dup(0)

stack ends

code segment
start:
     mov ax,data
     mov ds,ax
     mov ax,stack
     mov ss,ax
     
     mov dh,8
     mov dl,3
     mov cl,2
     mov si,0
     mov ax,0b800h
     mov es,ax;显示基地指
     

     
     call show_str
      mov ax,4c00h
      int 21h


show_str:
         mov al,160
         mov ah,dh
         mul ah
         mov bx,ax
         mov ah,0
         mov al,2
         mul dl;一个字符2b 列
         add bx,ax;列行实际地址
         mov al,cl;颜色储存在al

colour:
      ;检查字符串结束
      mov ch,0
      mov cl,[si]
      jcxz ok


   
   mov ah,[si]
   mov es:[bx],ah
   mov es:[bx].1,al
   add bx, 2
   inc si
   jmp short colour

      
         

ok:  
   ret

code ends
end start


改红色部分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-28 00:14:25 | 显示全部楼层
本帖最后由 jackz007 于 2021-3-28 00:51 编辑

        请彻底忘掉它们:最没有意义的代码
     assume ss:stack
     mov ax,stack
     mov ss,ax
     mov sp,32
        这是我修改的代码
data segment para public 'DATA'
        db 'welcome to masm ' , 0
data ends
stack segment para stack 'STACK'
        dw 400h dup(00) 
stack ends
code segment para public 'CODE'
        assume cs:code , ds:data
show_str proc near
        push bp
        mov bp,sp
        push ax
        push bx
        push cx
        push dx
        push si
        push di
        push ds
        push es
        lds si,[bp+0ah]          ; 字符串首地址
        mov ax,0b800h
        mov es,ax
        mov ax,word ptr[bp+08h]  ; 显示位置行号(从 1 开始起算)
        dec ax
        mov cl,0a0h
        mul cl
        push ax
        pop di
        mov ax,word ptr[bp+06h]  ; 显示位置列号(从 1 开始起算)
        dec ax
        shl ax,1
        add di,ax
        mov bx,word ptr[bp+04h]  ; 低 8 位显示颜色编码
        cld
s01:    lodsb
        or al,al
        jz s02
        stosb
        mov al,bl
        stosb
        jmp short s01
s02:    pop es
        pop ds
        pop di
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        mov sp,bp
        pop bp
        retn 0ah
show_str endp
main proc far
        mov ax,data
        mov ds,ax
        push ds         ; 字符串段地址
        xor ax,ax
        push ax         ; 字符串段内偏移       
        mov ax,13       
        push ax         ; 显示位置: 行号
        mov ax,32
        push ax         ; 显示位置: 列号
        mov ax,2
        push ax         ; 字符颜色
        call show_str
        xor ax,ax
        int 016h
        mov ax,4c00h
        int 021h
main endp
code ends
end main
        注意,我的代码会自动对号入座 ss 和 sp,而且,编译程序不会报 no stack 的警告。这才是一个汇编代码起码应该有的样子!在这方面,王爽的教程有着明显的缺陷,可以毫不客气地说,简直就是误人子弟!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-28 11:06:39 | 显示全部楼层
wtchou 发表于 2021-3-27 23:03
assume cs:code,ss:stack,ds:data

data segment

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

使用道具 举报

 楼主| 发表于 2021-3-28 11:13:56 | 显示全部楼层
jackz007 发表于 2021-3-28 00:14
请彻底忘掉它们:最没有意义的代码

        这是我修改的代码

哦哦 谢谢 可我暂时还看不懂你写的
为啥会自动对应
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-27 21:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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