. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
主题 : :  实验9自己编的程序,求改进  [已解决] 回复[ 8次 ]   点击[ 641次 ]  
xxie
[帖 主] [ 发表时间:2013-07-25 11:42 ] 
荣誉值:0
信誉值:2
注册日期:2011-07-19 12:12
自己编的,用debug可以通过,只是在编译的时候提示没有栈……
ASSUME    ES:DATA,SS:STACK,CS:CODE
        DATA  SEGMENT
              DB        'welcome to masm!'
        DATA  ENDS
       STACK  SEGMENT
              DW        8 DUP (0)
       STACK  ENDS
        CODE  SEGMENT

      START:  MOV       AX,DATA
              MOV       ES,AX
              MOV       AX,STACK
              MOV       SS,AX
              MOV       SP,16
              MOV       AX,0B800H
              MOV       DS,AX       ;变量初始化

              MOV       AX,01110001B
              PUSH      AX
              MOV       AX,00100100B
              PUSH      AX
              MOV       AX,00000010B
              PUSH      AX
              MOV       BP,SP       ;将颜色字入栈

              MOV       BX,0
              MOV       SI,0
              MOV       DI,0        ;寄存器初始化

              MOV       CX,11
          S:  ADD       BX,160
              LOOP      S

              MOV       CX,32
         S0:  ADD       SI,2
              LOOP      S0          ;初始化BX,SI

              PUSH      BX
              MOV       CX,3
         S1:
              PUSH      SI
              PUSH      CX
              PUSH      DI          ;用栈存储参数

              MOV       CX,16
         S2:  MOV       AH,SS:[BP]
              MOV       AL,ES:[DI]
              MOV       DS:[BX+SI],AX
              INC       DI
              ADD       SI,2
              LOOP      S2

              POP       DI
              POP       CX
              POP       SI
              ADD       BP,2
              ADD       BX,160      ;还原参数

              LOOP      S1         

              MOV       AX,4C00H
              INT       21H

        CODE  ENDS

              END       START
hky987654321
[第3楼] [ 回复时间:2013-08-07 21:38 ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
自己编的。在dosbox0.74上运行结果符合题目要求。特点是:没有用栈,在数据段中设置了循环中止标识,使用jcxz指令跳出循环。

;题目:第九章实验9,在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。
;解题思路:1、用数据类型db,将'welcome to masm!'这个包括字母、字格和标点符号的16个字符存储起来;同时还存储题目所要求的3种显示形式的属性字节。
;          2、用循环将存于数据段中的字符字节与属性字节按要求写入到B8000H—BFFFFH。

assume cs:code,ds:data

data segment
    db 'welcome to masm!'
    db 2h,24h,71h,0h         ;黑底绿字 = 0000 0010B = 2H ;绿底红色(字) 0010 0100B = 24H ;白底蓝色(字) 0111 0001B  = 71H;以0h作为结束标识
data ends

code segment
        start: mov ax,data       ;取出数据段地址
                mov ds,ax         ;定义数据的段地址
                sub si,si         ;用于存储换行偏移量
                mov ax,0B800h     ;将写入内存的段地址赋予ax
               mov es,ax         ;定义写入数据的内存空间的段地址                ;
               mov di,10h        ;用于存储取出的属性字节的偏移地址,第一个属性字节偏移地址为10h
                        
           s0: mov cx,[di]         ;从存储着属性字节及结束标识处取出数据
                mov ax,cx         ;存储取出的属性字节
                jcxz ok           ;判断是否取到结束标识,取到则转到ok,未取到则继续执行
                            
                mov cx,16         ;重新对cx进行赋值,以便循环执行取出和写入
                sub bx,bx         ;清0,bx用于存储取出字符的偏移量
                sub bp,bp         ;清0,bp用于存储写入字符的偏移量
            s1: mov dl,[bx]      ;取出字符
                mov es:[bp+1984+si],dl   ;写入字符,在显示缓冲区中居中             
               mov es:[bp+1985+si],al   ;写入属性字节,在显示缓冲区中居中               
               inc bl                   ;使取出和写入字符的偏移地址自增1
               add bp,2
               loop s1         ;16次循环后,完成一行字符及属性字节的取出和写入
                                        
                inc di          ;存储属性字节的偏移地址自增1,以便在新一轮循环中写入新的属性字节
                add si,160      ;在显示缓冲区换行,该区一行有160字节,三行均显示在同页
                loop s0         ;转到s0处开始新一行的读写
                        
           ok: mov ax,4c00h
              int 21h
                                        
code ends
end start
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved