. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9 作业,思路  [待解决] 回复[ 3次 ]   点击[ 285次 ]  
clue
[帖 主]   [ 发表时间:2009-04-12 05:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-11 03:39
程序使用双循环,第一层循环3行,第二层循环16个字符
中间使用栈保存cx值

es保存显示缓存区第1页的段地址

第一层中: (循环3次)
bp保存当前行在显示缓存区的偏移 (12~14行,即11*80*2, +80*2, +80*2)
bx保存当前行的字体样式地址 ds:[bx] (三种样式为:00000010b,00100100b,01110001b)

第二层中: (循环16次)
ah读取字体样式(mov ah,[bx])
si保存当前字符地址 ds:[si]
di保存字符要输出的位置在行中的列偏移 (32~47列,即32*2, +2, +2, ...)
----------------------
assume cs:codesg,ss:stacksg,ds:datasg

stacksg segment
        dw 8 dup(0)
stacksg ends

datasg segment
        db 'welcome to masm!'
        db 00000010b,00100100b,01110001b
datasg ends

codesg segment
start:
        mov ax,datasg
        mov ds,ax
        mov ax,0b800h
        mov es,ax
        
        mov cx,3
        mov bx,16
        mov bp,1760
row:
        push cx
        
        mov ah,[bx]
        mov cx,16
        mov si,0
        mov di,64
column:
        mov al,[si]
        mov es:[bp+di],ax

        inc si
        add di,2
        loop column
        
        inc bx
        add bp,160
        pop cx
        loop row
        mov ax,4c00h
        int 21h
codesg ends
end start
mess
[第1楼]   [ 回复时间:2009-04-14 16:09 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
逻辑很清晰啊,踩踩~\(≧▽≦)/~啦啦啦
cuttlefish
[第2楼]   [ 回复时间:2009-04-17 09:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-17 09:51
assume cs:code
data segment
db 'Welcome to masm!'
db 00000010b,00100100b,01110001b;表示绿色,绿底红色,白底蓝色
data ends

code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov bp,780h;屏幕中间的一行,即第13行,160*13=1920d
mov si,0
mov di,0

mov cx,3
s:
push cx
mov ah,10h[si];ah存放显示字符的属性
mov cx,10h;要复制的字符有16个0
s0:
mov al,[bx];
mov es:[bp+20h+di],ax
inc bx
add di,2
loop s0

mov bx,0;下一轮还是从DS的第一个字符开始复制
mov di,0
inc si;下一个要显示字符的属性
add bp,20h
pop cx
loop s

mov ax,4c00h
int 21h
code ends
end start

我在中间一行显示连续的三串字符串,也算对的吧?
cuttlefish
[第3楼]   [ 回复时间:2009-04-17 09:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-17 09:51
mov cx,10h;要复制的字符有16个,后面多打了一个0字
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved