. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9,无栈2重循环简单思考过程  [待解决] 回复[ 2次 ]   点击[ 232次 ]  
7_plz
[帖 主]   [ 发表时间:2010-04-05 15:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-27 20:47
在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串"welcome to masm!"
        
        屏幕为80*25,故中间为12,13,14行中的65字节(40h)至96字节处
        计算第12行起始为6e0h (11*160=1760/16=110%0 110/16=6%14 即为6e0h)
        第13行起始为6e0h+0a0h=780h (160/16=10%0 即0a0h)
        第14行起始为780h+0a0h=820h
        
        绿色      00000010b=2h
        绿底红色  00100100b=24h
        白底蓝色  01110001b=71h

        思考:需要将"welcome to masm!" 填入目标地址,在其中间加入颜色属性。
        程序过程:
        1.将字符串存入数据段
        2.将颜色属性存入数据段
        3.12行数据存入目标地址
        4.12行颜色属性存入目标地址,循环16次
        5.13行……
        6.14行……
        7.终止

        初步编程:
assume cs:code,ds:data
data segment
        db 'welcome to masm!'        ;字符串,颜色属性
        db 2h,24h,71h
data ends

code segment
start:
        mov ax,data                ;ds指向data
        mov ds,ax
        mov ax,0b800h                ;es指向显存0页
        mov es,ax

        mov di,0
        mov si,10h                ;si为颜色属性地址
        mov cx,3                ;3行,循环3次

s1:        mov dx,cx                ;2重循环,cx转存
        mov bx,0
        mov cx,16                ;字符串为16字节,循环16次
        mov bp,06e0h                ;06e0h为12行起始

s0:        mov al,[bx]
        mov es:[bp+di+40h],al        ;+40h即第65字节处
        mov ah,[si]
        mov es:[bp+di+41h],ah        ;颜色属性存入高位字节

        add bp,2                ;bp+2,因为ASCII码+颜色属性为1个字
        inc bx

        loop s0

        inc si
        add di,0a0h                ;di用作换行,1行160字节,即0a0h
        mov cx,dx

        loop s1

        mov ax,4c00h
        int 21h

code ends
end start

调试通过


最后想请问个问题,这个程序没有用到栈,所以我想把es改成ss,后面bp不用指明段地址了,编译连接通过,但是运行出错,何解?
versaariel
[第1楼]   [ 回复时间:2010-04-06 20:56 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
1.这个程序没有用到栈.不要认为没看见push pop指令,程序就没用到栈
2.修改如下:
mov ax,0b800h                ;es指向显存0页 
mov ss,ax 
mov sp,100                   ;insert new line
3.不要为了省力&偷懒而改变代码原本清晰的结构^-^
okenny
[第2楼]   [ 回复时间:2010-04-19 14:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-12-18 17:03
LZ,12,13,14的偏移地址有错。。。。。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved