. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9自己编的程序,求改进  [已解决] 回复[ 8次 ]   点击[ 638次 ]  
xxie
[帖 主]   [ 发表时间:2013-07-25 11:42 ]   [引用]   [回复]   [ top ] 
荣誉值: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
xxie
[第1楼]   [ 回复时间:2013-07-31 20:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-07-19 12:12
求建议或新的方法。
hky987654321
[第2楼]   [ 回复时间:2013-08-07 21:28 ]   [引用]   [回复]   [ top ] 
荣誉值: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   ;写入字符,在显示缓冲区中居中,一页25行(居中则25/2取整,等于12),一行160字节,故(160*12)+(160/2-32/2)=1984             
               mov es:[bp+1985+si],al   ;写入属性字节,在显示缓冲区中居中,一页25行(居中则25/2取整,等于12),一行160字节,故(160*12)+(160/2-32/2)+1=1985
               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
hky987654321
[第3楼]   [ 回复时间:2013-08-07 21:38 ]   [引用]   [回复]   [ top ] 
荣誉值: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
hky987654321
[第4楼]   [ 回复时间:2013-08-08 09:14 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
实验9的自我更正: 
    在一页共25行的屏幕上输出3行居中的彩色字符串'welcome to masm!'。它们在屏幕中的位置应为第12行、13行和14行。当第1个彩色字符在第12行居中时,其前11行字节数为6ech,本行前面还有40h个字节数。由此,第1个字母在720h处,第1个属性字节在721h处。因此, 
mov es:[bp+1984+si],dl   
mov es:[bp+1985+si],al 
应改为: 
mov es:[bp+720h+si],dl   
mov es:[bp+721h+si],al
lyzsmart
[第5楼]   [ 回复时间:2014-09-12 18:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2014-09-04 18:42
你这个程序用masm编译过吗
gyq
[第6楼]   [ 回复时间:2014-09-13 00:40 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2014-08-02 21:25
3楼的程序编译,链接,执行正确。
5楼要问什么啊?
648905586
[第7楼]   [ 回复时间:2014-11-01 13:52 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2014-07-16 21:39
编译都出错了啊
xxie
[第8楼]   [ 回复时间:2015-02-13 16:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-07-19 12:12
此贴由 贴主 于 [ 2015-02-13 16:56 ] 结贴。 结贴原因:问题已解决
得分情况: 2楼(hky987654321):10分   6楼(gyq):4分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved