标题:显示一行字符串的程序为什么会显示2行?
只看楼主
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
结帖率:100%
已结贴  问题点数:20 回复次数:3 
显示一行字符串的程序为什么会显示2行?
DATA SEGMENT
   db 'welcome to masm!',0
DATA ENDS
CODES SEGMENT
    ASSUME CS:CODES,DS:DATA,ss:stack
START:
    MOV dh,1        ;行号
    MOV dl,1        ;列号
    mov cl,2        ;颜色
    mov ax,data
    mov ds,ax
    mov si,0
      call show_str
      
      mov ax,4c00h
      int 21h
show_str:
    stack segment   ;建立栈空间
    dw 0
    stack ends
    mov ax,stack
    mov ss,ax
    mov sp,2
    mov al,0a0h  ;一行有160个字节
    mul dh        ;ax保存第n行前的n行字节数
    push ax
    mov ax,0
    mov dh,0     ;
    mov al,dl
    mov dl,2
    mul dl       ;ax保存第m列前的m列字节数
    pop bx
    add ax,bx        ;行偏移地址加列偏移地址等于总偏移地址
    push ax
    pop bx
    mov ax,0b800h        ;段地址
    mov es,ax
s:    push cx
    mov cl,[si]
    mov ch,0
    jcxz ok
    pop cx
    mov es:[bx+1],cl     ;写入颜色
    mov al,[si]
    mov byte ptr es:[bx],al ;写入字符
    add bx,2
    inc si
    jmp short s
    ok: ret
CODES ENDS
    END START
预计在第一行第一列(开始是第0列,第0行)写入"welcome to masm",结果第0行和第一行都写了该字符串,怎么回事?
王爽的汇编语言p206面第一小题

[此贴子已经被作者于2020-7-28 23:55编辑过]

搜索更多相关主题的帖子: DATA MOV 一行 stack 显示 
2020-07-28 23:40
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
知道了,把mov dh,0这一段删除就可以了,可是为什么会这样呢?
多这一段好像对程序不够成影响呀?
2020-07-29 00:19
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:20 
写法有点问题,可以精简一些,为了方便观看,改行号=10,列号=30


程序代码:
DATA SEGMENT
  MyStr db 'welcome to masm!',0
DATA ENDS
CODES SEGMENT
    ASSUME CS:CODES,DS:DATA
START:
    mov ax,data
    mov ds,ax
    MOV dh,10        ;行号
    MOV dl,30        ;列号
    mov cl,2         ;颜色
    lea si,MyStr
    call show_str
    mov ax,4c00h
    int 21h

show_str:
    mov al,80*2   ;一行有160个字节
    mul dh        ;ax保存第n行前的n行字节数
    mov dh,0      ;清除
    shl dl,1      ;dl * 2
    add ax,dx     ;加上ax
    mov di,ax     ;存入di
    mov ax,0b800h ;段地址
    mov es,ax    
    mov ah,cl     ;取颜色 
    cld           ;清除方向,影晌lodsb等指令,累加
s:  
    lodsb         ;相当于2条指令, mov al,ds:[si] .... inc si
    or al,al      ;al是否0 ?
    jz @f         ;是,离开
    stosw         ;相当于2条指令, mov es:[di],ax ... add di,2
    jmp short s   ;回圈
@@: ret

CODES ENDS
    END START




2020-07-29 06:12
try1008
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2022-6-14
得分:0 
2022-08-08 11:36



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502683-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.122329 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved