鱼C论坛

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

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

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

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

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

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

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

  2. data segment
  3. db'welcome to masm ',0
  4. data ends

  5. stack segment

  6. dw 16 dup(0)

  7. stack ends

  8. code segment
  9. start:
  10.      mov ax,data
  11.      mov ds,ax
  12.      mov ax,stack
  13.      mov ss,ax
  14.      
  15.      mov dh,8
  16.      mov dl,3
  17.      mov cl,2
  18.      mov si,0
  19.      mov ax,0b800h
  20.      mov es,ax;显示基地指
  21.      

  22.      
  23.      call show_str
  24.       mov ax,4c00h
  25.       int 21h


  26. show_str:
  27.          mov al,160
  28.          mov ah,dh
  29.          mul ah
  30.          mov bx,ax
  31.          mov ah,0
  32.          mov al,2
  33.          mul dl;一个字符2b 列
  34.          add bx,ax;列行实际地址
  35.          mov al,cl;颜色储存在al

  36. colour:
  37.       ;检查字符串结束
  38.       mov ch,0
  39.       mov cl,[si]
  40.       jcxz ok


  41.    
  42.    mov ah,[si]
  43.    mov es:[bx+si],ah
  44.    mov es:[bx+si].1,al
  45.    inc si
  46.    jmp short colour

  47.       
  48.          

  49. ok:  
  50.    ret

  51. code ends
  52. 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
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-27 18:50:34 | 显示全部楼层
dh存放要求行 dl列
小甲鱼最新课程 -> https://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


改红色部分
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

        请彻底忘掉它们:最没有意义的代码
  1.      assume ss:stack
  2.      mov ax,stack
  3.      mov ss,ax
  4.      mov sp,32
复制代码

        这是我修改的代码
  1. data segment para public 'DATA'
  2.         db 'welcome to masm ' , 0
  3. data ends
  4. stack segment para stack 'STACK'
  5.         dw 400h dup(00)
  6. stack ends
  7. code segment para public 'CODE'
  8.         assume cs:code , ds:data
  9. show_str proc near
  10.         push bp
  11.         mov bp,sp
  12.         push ax
  13.         push bx
  14.         push cx
  15.         push dx
  16.         push si
  17.         push di
  18.         push ds
  19.         push es
  20.         lds si,[bp+0ah]          ; 字符串首地址
  21.         mov ax,0b800h
  22.         mov es,ax
  23.         mov ax,word ptr[bp+08h]  ; 显示位置行号(从 1 开始起算)
  24.         dec ax
  25.         mov cl,0a0h
  26.         mul cl
  27.         push ax
  28.         pop di
  29.         mov ax,word ptr[bp+06h]  ; 显示位置列号(从 1 开始起算)
  30.         dec ax
  31.         shl ax,1
  32.         add di,ax
  33.         mov bx,word ptr[bp+04h]  ; 低 8 位显示颜色编码
  34.         cld
  35. s01:    lodsb
  36.         or al,al
  37.         jz s02
  38.         stosb
  39.         mov al,bl
  40.         stosb
  41.         jmp short s01
  42. s02:    pop es
  43.         pop ds
  44.         pop di
  45.         pop si
  46.         pop dx
  47.         pop cx
  48.         pop bx
  49.         pop ax
  50.         mov sp,bp
  51.         pop bp
  52.         retn 0ah
  53. show_str endp
  54. main proc far
  55.         mov ax,data
  56.         mov ds,ax
  57.         push ds         ; 字符串段地址
  58.         xor ax,ax
  59.         push ax         ; 字符串段内偏移      
  60.         mov ax,13      
  61.         push ax         ; 显示位置: 行号
  62.         mov ax,32
  63.         push ax         ; 显示位置: 列号
  64.         mov ax,2
  65.         push ax         ; 字符颜色
  66.         call show_str
  67.         xor ax,ax
  68.         int 016h
  69.         mov ax,4c00h
  70.         int 021h
  71. main endp
  72. code ends
  73. end main
复制代码

        注意,我的代码会自动对号入座 ss 和 sp,而且,编译程序不会报 no stack 的警告。这才是一个汇编代码起码应该有的样子!在这方面,王爽的教程有着明显的缺陷,可以毫不客气地说,简直就是误人子弟!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

data segment

oo 谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

        这是我修改的代码

哦哦 谢谢 可我暂时还看不懂你写的
为啥会自动对应
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 20:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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