. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9, 简单的设计!  [待解决] 回复[ 14次 ]   点击[ 898次 ]  
yugong
[帖 主]   [ 发表时间:2008-10-15 10:06 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:8
注册日期:2008-09-15 09:10
assume cs:code ,ds:data 

data segment
       db 'welcome to masm!'
       db 02h,24h,71h    ;三种显示属性
data ends

code segment 
 start:mov ax,data
       mov ds,ax
       mov si,16

       mov ax,0B800H    ;定位到屏幕中间
       mov es,ax
       mov bp,7C0H
               
       mov cx,3
    s0:mov ax,cx
       mov bx,0        
       mov dh,ds:[si]
       mov cx,16
       s: mov dl,[bx]
          mov es:[bp],dl
          mov byte ptr es:[bp+1],dh
          inc bx
          add bp,2
           loop s
       add bp,128
       inc si
       mov cx,ax
       loop s0
           
       mov ax,4c00h
      int 21h
code ends
end start
请问高手,没有没用别的方法实现的,贴出来参考!
mouse
[第1楼]   [ 回复时间:2008-10-15 10:21 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
这个题的思路不太复杂,楼主的思路不错,循环嵌套节省了好几行代码。

小细节也可以自己考虑下,比如保存cx用栈是不是更合适,更利于扩展。
可不可以用mov es:[..],dx代替上面的两条指令等等
yugong
[第2楼]   [ 回复时间:2008-10-15 11:13 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:8
注册日期:2008-09-15 09:10
回第1楼:
你这个问题提的很好,用栈当然就利于扩展了!
但就对这个程序而言,若用栈就会用许多内存。

‘可不可以用mov es:[..],dx代替上面的两条指令等等‘
你这个我没有看明白
yugong
[第3楼]   [ 回复时间:2008-10-15 11:16 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:8
注册日期:2008-09-15 09:10
针对上面的程序我又想了一种用本章才学的jcxz指令的设计
assume cs:code ,ds:data 

data segment
       db 'welcome to masm!'
       db 02h,24h,71h      ;显示属性
       dw 0,0,1            ;控制jcxz跳转
data ends

code segment 
 start:mov ax,data
       mov ds,ax
       mov si,16
       mov di,19

       mov ax,0B800H
       mov es,ax
       mov bp,7C0H
               
 
  
    s0: mov bx,0  
       mov ah,ds:[si]
       mov cx,16
       s: mov al,[bx]
          mov es:[bp],al
          mov byte ptr es:[bp+1],ah
          inc bx
          add bp,2
           loop s
       add bp,128
       inc si
       mov cx,ds:[di]
       inc di
       jcxz s0
           
       mov ax,4c00h
       int 21h
code ends
end start           
如有好的设计,不凡一起讨论!!
gulunhua
[第4楼]   [ 回复时间:2008-11-13 15:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-11-06 14:36
这个是我的实现:
ssume cs:code,ds:data

data segment
  db 'welcome to masm!'
data ends

code segment
  start:mov ax,data
        mov ds,ax
        
        mov bp,0
        mov cx,11
      r:add bp,00a0h
        loop r

        mov ax,0b800h
        mov es,ax

        mov di,0
        mov bx,0
        mov si,0
        mov cx,16
      s:mov al,ds:[bx+si]

        mov es:[bp+64+0+di],al
        mov ah,02h
        mov es:[bp+64+1+di],ah

        mov es:[bp+64+160+0+di],al
        mov ah,24h
        mov es:[bp+64+160+1+di],ah

        mov es:[bp+64+320+0+di],al
        mov ah,71h
        mov es:[bp+64+320+1+di],ah         

        inc si
        add di,2
        loop s

        mov ax,4c00h
        int 21h

code ends

end start
greatbob2008
[第5楼]   [ 回复时间:2008-11-14 06:29 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-27 02:35
LZ的程序把我显卡弄烂了,郁闷中
mess
[第6楼]   [ 回复时间:2008-11-14 23:26 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
不至于吧,呵呵

不可能是程序把显卡弄坏的,上面的这个程序和你看显卡可是不同层面的东西。
fairyhuang
[第7楼]   [ 回复时间:2008-11-15 15:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-14 21:07
assume cs:codesg,ds:datasg 

datasg segment 
 db 02h,24h,71h,'welcome to masm!' 
datasg ends 

codesg segment 
start:mov ax,datasg 
      mov ds,ax 
      mov si,0 ;index of stored attribute 
      mov di,3 ;index of stored sentence 
      mov cx,3 ;loop times of showing sentence 
      mov ax,0b800h ;segment address of video memory 
      mov es,ax 
      mov bx,0720h  ;offset address of video memory 

    s:push cx 
      push bx 
      mov cx,16 ;loop times of showing seperate character 
   s0:mov al,[di] 
      mov es:[bx],al 
      mov al,[si] 
      mov es:[bx+1],al 
      add bx,2 
      inc di 
      loop s0 
      pop bx 
      pop cx 
      inc si 
      mov di,3 
      add bx,00a0h 
      loop s 
mov ax,4c00h 
int 21h 
codesg ends 
end start 

注意:pop bx,pop cx顺序,应和push时的次序相反. 
否则会造成死循环.
lanqiaojun
[第8楼]   [ 回复时间:2008-12-10 16:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-11-17 13:51
c:\masm\1.asm(17): Out of memory


内存溢出?
windflower
[第9楼]   [ 回复时间:2009-02-01 22:32 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-01-28 11:57
我编了一个,不知是三循环吗? 
assume cs:code,ss:stack,ds:data 
data segment 
db 'welcome to masm!' 
data ends 
stack segment 
db 16 dup (0) 
stack ends 
code segment 

start: mov ax,data 
       mov ds,ax 
       mov ax,stack 
       mov ss,ax 
       mov sp,16 
       mov ax,0b800h 
       mov es,ax 
       mov si,0720h 
       mov dx,02h 
       mov cx,1 
       push cx 
       mov cx,2 
       push cx 

s0:    push cx 
       mov cx,16 
       mov bx,0 

s:     mov ax,[bx] 
       mov es:[si],ax 
       mov es:[si+1],dx 
       add si,2 
       inc bx 
       loop s 

       mov si,07c0h 
       mov dx,24h 
       pop cx 
       loop s0 

       mov si,0860h 
       mov dx,71h 
       pop cx 
       loop s0 

       mov ax,4c00h 
       int 21h 
code ends 
end start
maxm
[第10楼]   [ 回复时间:2009-02-12 13:17 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:4
注册日期:2009-01-15 22:41
assume cs:codesg, ds:datasg
datasg segment
        db 'welcome to masm!'
        db 02h,24h,71h
datasg ends

codesg segment
start:        mov ax,datasg
        mov ds,ax
        mov bx,0                ;bx定位目标行
        mov si,0                ;si用来定位datasg中要显示的字符
        mov ax,0b872h
        mov es,ax
        mov di,0                ;使es:[di]指向要显示的第一个单元
        mov bp,16                ;ds:[bp] 用来定位属性
        mov cx,3
s:        push cx
        mov cx,16
s0:        mov al,ds:[si]                ;al存放字符ascii码
        mov ah,ds:[bp]                ;ah存放属性
        mov es:[bx+di],al        ;偶位存放字符ascii码
        mov es:[bx+di+1],ah        ;奇位存放属性
        inc si
        add di,2
        loop s0
        mov si,0                ;一定要加这句,三次都要循环读取同样的'welcome to masm!'
        inc bp
        add bx,128
        pop cx
        loop s

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

好像有点小问题,就是找不出来。
popliuyu
[第11楼]   [ 回复时间:2009-02-27 14:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-02-22 22:46
assume cs:code

data segment
        db 'welcome to masm!'
        db 02h,24h,71h
data ends

stack segment
        dw 8 dup(0)
stack ends

code segment

start:        mov ax,stack
        mov ss,ax
        mov sp,16

        mov ax,0b800h
        mov ds,ax
        mov bx,1920                                ;ds:[bx]指向第12行第一个字符的显存
        
        mov ax,data
        mov es,ax
        
        mov cx,3
        mov bp,0
s0:        push cx
        mov cx,16
        mov si,0
        mov di,0

s:        mov al,es:[di]
        mov [bx+64+si],al                        ;显示的字母
        mov ah,es:[bp+16]
        mov [bx+65+si],ah                        ;显示的颜色
        add si,2
        inc di
        loop s

        pop cx
        add bx,160                                ;显示下一行
        inc bp                                        ;改变颜色
        loop s0

        mov ax,4c00h
        int 21h

code ends

end start
贴个玩玩
mengdewan
[第12楼]   [ 回复时间:2009-03-02 10:37 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:5
注册日期:2008-12-18 16:07
那个程序的效果图是什么样的,能贴出来看看吗?想看看编出来的是样子的
popliuyu
[第13楼]   [ 回复时间:2009-03-02 21:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-02-22 22:46
说我的这个吗?
17300
[第14楼]   [ 回复时间:2009-03-04 13:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-02-21 14:11
我的写得简单了  没有你们的思维复杂   可能我是新手吧
ASSUME CS:CODESG
DATA SEGMENT
dw 119,101,99,111,109,101,32,109,97,115,109,33
DATA ENDS
CODESG SEGMENT
START: MOV AX,DATA
       MOV DS,AX
       MOV BX,0
       
       MOV AX,0B800H
       MOV ES,AX

       MOV CX,12
S:     MOV DX,DS:[BX]
       MOV ES:[BX],DX
       mov es:[bx+160],dx
       mov es:[bx+320],dx
       mov es:[bx+1],0CAh
       mov es:[bx+161],42h
       mov es:[bx+321],71h
       add bx,2
LOOP S
       MOV AX,4C00H
       INT 21H
CODESG ENDS
END START
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved