万千只cnm 发表于 2021-3-27 18:49:13

实验十(按需求行列 显示颜色字符

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

这是我的代码
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,
      jcxz ok


   
   mov ah,
   mov es:,ah
   mov es:.1,al
   inc si
   jmp short colour

      
         

ok:
   ret

code ends
end start


万千只cnm 发表于 2021-3-27 18:50:34

dh存放要求行 dl列

wtchou 发表于 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,
      jcxz ok


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

      
         

ok:
   ret

code ends
end start


改红色部分

jackz007 发表于 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,          ; 字符串首地址
      mov ax,0b800h
      mov es,ax
      mov ax,word ptr; 显示位置行号(从 1 开始起算)
      dec ax
      mov cl,0a0h
      mul cl
      push ax
      pop di
      mov ax,word ptr; 显示位置列号(从 1 开始起算)
      dec ax
      shl ax,1
      add di,ax
      mov bx,word ptr; 低 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 的警告。这才是一个汇编代码起码应该有的样子!在这方面,王爽的教程有着明显的缺陷,可以毫不客气地说,简直就是误人子弟!

万千只cnm 发表于 2021-3-28 11:06:39

wtchou 发表于 2021-3-27 23:03
assume cs:code,ss:stack,ds:data

data segment


oo 谢谢

万千只cnm 发表于 2021-3-28 11:13:56

jackz007 发表于 2021-3-28 00:14
请彻底忘掉它们:最没有意义的代码

      这是我修改的代码


哦哦 谢谢 可我暂时还看不懂你写的{:5_104:}
为啥会自动对应
页: [1]
查看完整版本: 实验十(按需求行列 显示颜色字符