. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于实验九的作业已独立完成,希望大家给予指点:)  [待解决] 回复[ 3次 ]   点击[ 473次 ]  
cfcxg
[帖 主]   [ 发表时间:2009-05-06 14:54 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26
对于实验九,我用两种方法完成了实验,第一种的结果是将三种效果的字符串在屏幕中间的同一行里显示出来。第二种方法的结果是将三种效果的字符串在屏幕中间的三行中分别显示出来。程序运行后都已达到预想的结果,只是不知道我在程序的编排上和指令的用法上有没有不合理的地方,希望大家给予指点:)

第一种方法:
assume cs:code,ds:data
data segment
     db 3 dup ('w e l c o m e   t o   m a s m !   ')     ;定义数据段的数据,我原本想用dw
data ends
code segment
start:mov ax,data
     mov ds,ax
     mov ax,0b800h
     mov es,ax
     mov bx,0
     mov si,0
     mov di,079eh
     mov cx,16                            
  s: mov byte ptr [bx+1],02h
     mov byte ptr [bx+35],0aeh
     mov byte ptr [bx+69],79h
     add bx,2
     loop s
     mov bx,0
     mov byte ptr [bx+33],0
     mov byte ptr [bx+67],0
     mov cx,50
 s1: mov ax,[si]
     mov es:[di],ax
     add si,2
     add di,2
     loop s1
     mov ax,4c00h
     int 21h
code ends
end start

第二种方法:

assume cs:code,ds:data,ss:stack
data segment
     db 'welcome to masm!'
     db 02h,0aeh,79h
data ends
stack segment
db 16 dup (0)
stack ends
code segment
start:mov ax,data
     mov ds,ax
     mov ax,0b800h
     mov es,ax
     mov ax,stack
     mov ss,ax
     mov sp,16
     mov bp,0
     mov bx,0
     mov cx,3
 s1: push cx
     mov si,0
     mov di,720h                               定义屏幕的中间位置
     mov cx,16
 s:  mov al,ds:[si]
     mov byte ptr es:[bx+di],al                 ;感觉这里bx用的好像有点笨
     mov al,ds:[bp+16]
     mov byte ptr es:[bx+di+1],al
     inc si
     add di,2
     loop s
     pop cx
     add bx,160
     inc bp
     loop s1
     mov ax,4c00h
     int 21h
code ends
end start
hanlsheng
[第1楼]   [ 回复时间:2009-05-07 23:13 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-12-15 16:17
这是我实现的代码,类比你第二种方法:


相互学习!

assume cs:codesg ,ds:datasg

datasg segment
        db 'welcome to masm!'
datasg ends

codesg segment
start: mov ax,datasg
        mov ds,ax
        mov si,0
                         
        mov ax,0b800h
        mov es,ax
        mov di,780h ;设置中间行
        add di,76  ;设置中间列
                         
        mov cx,16
                         
s:      mov ah,ds:[si]
        mov es:[di],ah    ;行1字符
        mov es:[di+0a0h],ah ;行2字符
        mov es:[di+140h],ah  ;行3字符 ,通过偏移灵活定位
        inc di
        mov byte ptr es:[di],02h  ;行1颜色
        mov byte ptr es:[di+0a0h],24h ;行2颜色
        mov byte ptr es:[di+140h],71h ;行3颜色
        inc di
        inc si
        loop s
                         
        mov ax,4c00h
        int 21h
                         
codesg ends

end start
cfcxg
[第2楼]   [ 回复时间:2009-05-08 11:02 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26
呵呵,对比楼上的朋友确实有可学的地方,字符与属性在同一循环中分别设置,有层次感:)
hswad
[第3楼]   [ 回复时间:2009-05-15 10:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-11 15:51
学习下,请指教

assume cs:code,es:table,ss:stack
table segment
db 'welcome to masm!'
db 02h,24h,71h,11001010b  ;02h:黑底绿色 24h:绿底红色 71h:白底蓝色 
table ends

stack segment
db 16 dup(0)
stack ends

code segment
start:
mov ax,0b800h
mov ds,ax
mov ax,table
mov es,ax
mov ax,stack
mov ss,ax
mov sp,16
mov bx,0
mov bp,0
mov cx,4

s:
push cx
mov si,0
mov di,0

mov cx,16

s0:
mov al,es:[si]
mov ds:[bx+di+71eh],al
mov ah,es:[16+bp]
mov ds:[bx+di+71fh],ah
inc si
add di,2
loop s0

inc bp
add bx,160
pop cx
loop s

mov ax,4c00h
int 21h

code ends
end start
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved