. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  【实验九详解】  [已解决] 回复[ 6次 ]   点击[ 1315次 ]  
masmaster
[帖 主]   [ 发表时间:2010-07-25 12:44 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
这个实现方法是用一个循环逐列显示字符。
;--------------------------------------------------------------------------------------
assume  cs:code
data    segment
        db      'Welcome to Masm!'
data    ends
code    segment
start:
        mov ax,data              ;装入DS
        mov ds,ax
        mov ax,0b800h            ;指定显示区域DS
        mov es,ax
        mov bx,0                 ;首地址
        mov bp,60                ;列的初始值
        mov cx,16                ;16次循环
s:      mov si,12*160            ;行的初始值
        mov ah,72h               ;指定颜色
        mov al,[bx]              ;装入ASCII字符
        mov es:[si+bp],ax        ;把白底绿字装入指定位置
        add si,160               ;指向下一行
        mov ah,24h               ;指定颜色
        mov al,[bx]              ;装入ASCII字符
        mov es:[si+bp],ax        ;将绿底红字装入指定位置
        add si,160               ;指向下一行
        mov ah,17h               ;指定颜色
        mov al,[bx]              ;装入ASCII字符
        mov es:[si+bp],ax        ;把白底蓝字装入指定位置
        inc bx                   ;指向下一个字符
        add bp,2                 ;指向下一列位置
        loop s
        mov ah,4ch
        int 21h
code    ends
end     start
;--------------------------------------------------------------------------------------
masmaster
[第1楼]   [ 回复时间:2010-07-25 13:03 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
第九行应该是
mov ax,0b800h            ;指定显示区域ES
jiych
[第2楼]   [ 回复时间:2010-07-25 14:43 ]   [引用]   [回复]   [ top ] 
荣誉值:15
信誉值:0
注册日期:2010-06-02 22:04
哈哈学习了,原来中间行的位置没必要自己去具体算出来的:mov si 12*160;哈哈
masmaster
[第3楼]   [ 回复时间:2010-07-25 14:56 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
因为一行80个字符160个字节嘛
yiday
[第4楼]   [ 回复时间:2010-07-28 21:35 ]   [引用]   [回复]   [ top ] 
荣誉值:5
信誉值:0
注册日期:2009-09-24 17:56
我这样做不知对不对
;程序功能:在内存地址B8000H - B8FFFFH共32KB的空间显示字符串
assume cs:code , ss:stack

stack segment
        db 'welcome to masm!'
stack ends

code segment
start:        mov ax,stack
                mov es,ax
                mov ax,0b800h
                mov ds,ax
                mov bx,820H
                mov di,0
                mov cx,10h
                
        s:        mov al,es:[di]
                mov ah,00000010b;
                mov ds:72[bx],ax
                mov ah,00100100b
                mov ds:232[bx],ax
                mov ah,01110001b
                mov ds:392[bx],ax
                add bx,2
                add di,1
                loop s
                
                mov ax ,4c00h
                int 21h
code ends
end start
masmaster
[第5楼]   [ 回复时间:2010-08-02 22:37 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
再将这样的解法详解, 希望对大家有用吧。
;----------------------------------------------------------------------------------------
  1 assume    cs:code,ds:data
  2 data    segment
  3         db      'welcome to masm!'
  4         db      02h,24h,71h
  5 data    ends
  6 code    segment
  7 start:
  8         mov ax,data                ;指定数据段DS
  9         mov ds,ax
 10         mov ax,0b800h              ;显示区域为附加段ES
 11         mov es,ax
 12         mov di,780h                ;ES:DI起始行
 13         mov bx,10h                 ;颜色属性,地址为:DS:[BX]
 14         mov cx,3                   ;3个颜色
 15 a:                                 ;外循环对3中颜色循环, 依次是02,24h,71h
 16         push cx                    ;由于内循环要用到cx,故保存
 17         push di                    ;保存初始行
 18         mov si,0                   :字符首地址ds:si
 19         mov cx,16                  ;内循环开始,依次遍历16个字符
 20 b:      mov al,[si]                ;将asacii放入al
 21         mov ah,[bx]                ;将属性放入ah
 22         mov es:[di+40h],ax         ;显示
 23         inc si                     ;指向下一个字符
 24         add di,2                   ;指向下一个显示位置
 25         loop b                     ;如cx=0,则内循环结束
 26         pop di                     ;第一次循环结束,恢复初始行的值
 27         pop cx                     ;恢复cx
 28         inc bx                     ;ds:[bx+1],指向下一个属性
 29         add di,0a0h                ;第二行
 30         loop a                     ;外循环,如3个属性遍历完毕则跳出循环
 31
 32         mov ah,4ch
 33         int 21h
 34 code    ends
 35 end     start
;----------------------------------------------------------------------------------------
masmaster
[第6楼]   [ 回复时间:2010-08-09 13:59 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
此贴由 贴主 于 [ 2010-08-09 13:59 ] 结贴。 结贴原因:问题已解决
得分情况: 2楼(jiych):5分   4楼(yiday):5分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved