. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9  刚做出来!有点显摆的嫌疑!36行代码!(包含伪指令)  [待解决] 回复[ 33次 ]   点击[ 1380次 ]  
ye547896
[帖 主]   [ 发表时间:2010-02-10 18:23 ]   [引用]   [回复]   [ top ] 
荣誉值:8
信誉值:0
注册日期:2009-11-09 19:48
我也想过闹个循环,不过嫌麻烦我就直接这样了!





assume cs:code
data segment
        db 'welcome to masm!'        ;定义要显示的字符串(共16字节)
        db 02h,24h,71h        ;定义三种颜色属性
data ends
code segment
start:        mov ax,data
        mov ds,ax
;这不用解释吧?
        mov ax,0B800h
        mov es,ax
;那什么显示缓冲区的段地址
        mov bx,0
        mov di,0
        mov cx,10h
s:        mov al,ds:[bx]
;取出字符,放到AL中。
        mov ah,ds:[10h];取出颜色,放到AH中。
        mov es:7c0h[si],ax
;显示字符
        mov ah,ds:[11h];取出颜色,放到AH中。
        mov es:860h[si],ax
;显示字符
        mov ah,ds:[12h];取出颜色,放到AH中。
        mov es:900h[si],ax
;显示字符
        inc bx
        add si,2
loop s
        mov ax,4c00h
        int 21h
code ends
end start
regex
[第1楼]   [ 回复时间:2010-02-10 23:43 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
good, 向你学习
qiangzi
[第2楼]   [ 回复时间:2010-02-11 00:44 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37
不错!!!值得学习
langzi82561
[第3楼]   [ 回复时间:2010-03-01 22:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-02-18 19:15
一个循环就解决!高!
我写的程序是两个循环,我愁!
qiaofeng
[第4楼]   [ 回复时间:2010-03-14 15:31 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-03-05 10:51
高手,就是不一样,一定向你学习!!
ailesargentees
[第5楼]   [ 回复时间:2010-03-23 14:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-02 17:21
LZ代码美中不足之处 好像没有把三行字放在25行屏幕正中间的12、13、14行,而是放在了13、14、15行

对于16个占16位的字符(即总共大小20H) 第一行的偏移地址范围是 00h-9fh 所以起始写入的偏移地址是

(9fh+1h-20h)/2=40h 这个和LZ算得一样

那么第二行就是 40H+a0H=e0H

第n行就是 40H+(n-1)a0H

n分别等于12 13 14的时候 对应的中间的地址就是 40H+6e0H=720H;40H+780H=7c0H;40H+820H=860H

LZ分别下移了一行
zihaolee
[第6楼]   [ 回复时间:2010-04-24 14:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-04 10:05
好美丽的程序 学习中
ln_ydc
[第7楼]   [ 回复时间:2010-05-08 00:13 ]   [引用]   [回复]   [ top ] 
荣誉值:14
信誉值:10
注册日期:2010-03-02 17:00
good I love it
tink_tink
[第8楼]   [ 回复时间:2010-05-31 08:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-26 15:09
mov es:7c0h[si],ax 
mov es:860h[si],ax 
mov es:900h[si],ax 
请问这3条程序的si有什么用么
这里不是很明白
tink_tink
[第9楼]   [ 回复时间:2010-05-31 08:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-26 15:09
我问错了
我的意思是前面貌似没给si赋值
能用么
tink_tink
[第10楼]   [ 回复时间:2010-05-31 08:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-26 15:09
mov es:7c0h[si],ax  
mov es:860h[si],ax  
mov es:900h[si],ax  
你这3条程序里的si应该是di吧
xiaohao
[第11楼]   [ 回复时间:2010-06-18 18:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-10 15:47
不怎么严谨...
love34
[第12楼]   [ 回复时间:2010-07-15 15:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-08 15:17
颜色属性可以用立即数直接传递,数据段可以少一行、、、
wjd45
[第13楼]   [ 回复时间:2010-07-17 20:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-07-11 16:48
有两个疑问:
1.mov es:7c0h[si],ax这里用al会不会更严谨,虽然ax也可以通过,但是前面值是赋给al的,我想统一会不会更好理解?
2.虽然这个程序这样可以不用循环,但是如果要显示100行,200行呢?LZ也这样去算吗?所以我觉得对编程而言,会不会不太科学?
我也是新学,老实说我也和楼主用同样方法的,但我想这个方法会不会不科学?
wjd45
[第14楼]   [ 回复时间:2010-07-17 21:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-07-11 16:48
不好意思,第一个是我刚才没看懂........现在明白了.
tianya0035
[第15楼]   [ 回复时间:2010-07-25 21:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-07-16 17:17
我的作业:用了一个循环,缺点是用的寄存器太多,像颜色那可以用出入栈。
=============
assume cs:code,ds:data
data segment

db 'welcome to masm!' ;定义字符串
db 02h,24h,71h ;定义3种颜色

data ends

code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h ;屏幕中间显示的内存段地址
mov es,ax
mov bx,0

mov cx,3 ;外循环3次,3种颜色
mov bp,0 ;取颜色的指针
s1:
mov dx,cx ;保持外循环的cx
mov ah,ds:[16+bp] ;颜色属性保存在ah
mov cx,16 ;内循环16次,因为有16个字节
mov di,0
mov si,0

s2:
mov al,ds:[di] ;第1个字的ASC11码保存在al中
mov es:[bx+si+7d0h],al ;bx为显示换行的偏移,si为显示内存的每个字ASC11码偏移,7d0h表示大约是在屏幕中间
mov es:[bx+si+7d1h],ah
add di,1
add si,2
loop s2

inc bp
mov cx,dx
add bx,0a0h

loop s1

mov ax,4c00h
int 21h

code ends
end start
songweiguo8660
[第16楼]   [ 回复时间:2011-04-24 01:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-07-08 20:41
学习了!!很精巧!!
you8881111
[第17楼]   [ 回复时间:2011-05-06 21:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-05-03 21:02
弄了半天原来理解错题意了,我还以为是让3个单词分别显不同颜色了,我说怎么可能一个循环,笨啊!
you8881111
[第18楼]   [ 回复时间:2011-05-07 15:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-05-03 21:02
我按LZ的思想重编了一下为什么不对请各位看看
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 ax,0b800h
      mov es,ax
      mov bx,0
      mov si,0
      mov cx,10h
s:mov al,[bx]
  mov ah,[10h]
  mov es:7c0h[si],ax
  mov ah,[11h]
  mov es:860h[si],ax
  mov ah,[12h]
  mov es:900h[si],ax
  inc bx
  add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start
you8881111
[第19楼]   [ 回复时间:2011-05-07 16:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-05-03 21:02
调试过发现了问题,原来在 [idata] 前必须得加上 ds: ,不然debug显示出来的指令不是 mov ah,[10h],而是mov ah,10 ,查了一下书跟书上所述不符呀。
feixia
[第20楼]   [ 回复时间:2011-05-14 16:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-05-03 16:34
assume cs:code,ss:stack

stack segment
db "wlcome to masm!";定义字符asscii码
db 01h,14h,71h;定义字符属性
stack ends
code segment
start:mov ax,stack
      mov ss,ax

      mov ax,0B800h
      mov ds,ax
      mov cx,3
      mov bx,11;定义行

    s:mov dx,cx
      
      mov cx,8
      mov si,25;定义列
      mov bp,0
      mov di,15;属性
      mov al,[bp]
      mov ah,[bp+di]
   s1:mov [bx+si],al;把ASCII码送入
      mov [bx+si+1],ah;把属性送入
      add si,2
      loop s1

      add bx,16
      inc di
      mov cx,dx
      loop s
  
      mov ax,4c00h
      int 21h

code ends
end start
y.h
[第21楼]   [ 回复时间:2011-05-20 00:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-14 23:44
assume cs:code
data segment
        db 'welcome to masm!'
        db 02h,24h,71h
data ends
code segment
start:  mov ax,data
        mov ds,ax
        mov ax,0b800h
        mov es,ax
        mov bx,0
        mov si,0
        mov cx,10h
s:      mov al,ds:[bx]
        mov ah,ds:[10h]
        mov es:[si+680h],ax
        mov ah,ds:[11h]
        mov es:[si+7c0h],ax
        mov ah,ds:[12h]
        mov es:[si+900h],ax
        inc bx
        add si,2
loop s 
        mov ax,4c00h
        int 21h
code ends
end start
我也教我的代码上去显摆显摆 不加注释了 大家都知道是啥意思!
lshang
[第22楼]   [ 回复时间:2011-06-16 22:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-01-19 00:37
那我也只好献丑了

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 ax,0B800H 
                mov es,ax        ;以上部分初始化段寄存器 

                mov bx,67EH ;67EH指向屏幕中间第0行 
                mov di,10H  ;10H指向第0个属性 
                xor si,si   ;si清零指向字符串第0个字节 
                mov cx,10H  ;cx控制循环次数,共16次 
        S: 
                mov al,[si]   ;al寄存器存放显示的ASCii码 
                mov ah,0[di]  ;ah寄存器存放将传递的属性值 
                mov es:[bx],ax   ;送到屏幕中间第0行 
                mov ah,1[di] 
                mov es:0A0H[bx],ax   ;送到屏幕中间第1行 
                mov ah,2[di] 
                mov es:0A0H+0A0H[bx],ax   ;送到屏幕中间第2行 

                inc si          ;si自加一,指向下一字节 
                add bx,2  ;bx加2,指向下一字单元 
                loop S 

                mov ax,4C00H 
                int 21H 

code ends 
end start
cjlchenjilin
[第23楼]   [ 回复时间:2011-07-01 13:17 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:0
注册日期:2011-05-30 14:33
very good!  不过跟第九章的知识点没什么联系!像第八章的!作者本意是要用跳转指令。
vs9841
[第24楼]   [ 回复时间:2011-07-01 16:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29
好像都只是行到了屏幕中间,列方向还是没有到中间呀
下面是我改的一段:
输出到屏正中央:
assume cs:codesg,ds:datasg
        datasg segment
               db 'welcome to masm!'
        datasg ends
        codesg segment

        start: mov ax,datasg
               mov ds,ax
               mov bx,0
               mov si,0
               mov cx,16
               mov ax,0b800h
               mov es,ax

           s:  mov al,[bx]            ;将datasg段字符附给ax
               mov ah,2               ;将字符定义绿色字体
               mov es:6e0h[si+64],ax
               mov ah,42h             ;红底绿字
               mov es:780h[si+64],ax
               mov ah,71h             ;白底蓝字
               mov es:820h[si+64],ax
               inc bx
               add si,2
               loop s
               
               mov ax,4c00h
               int 21h
        codesg ends
end start
rlfrlf
[第25楼]   [ 回复时间:2011-07-30 10:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-07-11 19:02
献丑

assume cs:codesg
data segment
        db 'welcome to masm!'
        db 02h,24h,71h
data ends

codesg segment
start:        mov ax,data
        mov ds,ax
        mov ax,0B800h
        mov es,ax
        
        mov bx,0
        mov bp,0
        mov si,0
        mov di,0


        mov cx,3
s:        mov dx,cx
        mov ax,0

        mov cx,16

s1:        mov al,ds:[di+0]
        mov ah,ds:[bx+16]
        mov es:[bp+si+700],ax
        
        add si,2
        inc di
        loop s1
        
        mov di,0
        mov si,0
        add bx,1
        add bp,160

        mov cx,dx
        loop s

        mov ax,4c00h
        int 21h

codesg ends
end start
jeromepu
[第26楼]   [ 回复时间:2011-08-06 15:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-07-28 21:47
LZ强,学习中...

assume cs:code,ds:data,ss:stack

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

stack segment
     dw 16 dup (0)
stack ends

code segment
start:    mov ax,data
     mov ds,ax
     mov bx,0
     mov ax,stack
     mov ss,ax
     mov ax,0b872h
     mov es,ax
     mov si,0
     mov di,1
     mov cx,3

s:  push cx
    mov cx,16
s1:mov al,[bx]
   mov es:[si],al
   inc bx
   add si,2
   loop s1
   add si,128
   mov bx,0
   pop cx
   loop s

add bx,10h
mov cx,3
s2: push cx
    mov cx,16
s3: mov al,[bx]
    mov es:[di],al
    add di,2
    loop s3
    add di,128
    inc bx
    pop cx
    loop s2

mov ax,4c00h
int 21h
code ends
end start
tomomi
[第27楼]   [ 回复时间:2011-08-25 11:27 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-05-12 13:02
assume cs:code,ds:data 

data segment 
db 'welcome to masm!' 
data ends 

code segment 

start:  mov ax,data     
     mov ds,ax 
     
     mov ax,0B872H 
     mov es,ax 
       
     mov di,0 
     mov si,0 
     mov cx,16 

s:   mov al,[di]   ;循环16次把welcome to masm!复制到3行 
     mov es:[si],al
     mov es:[si+1],2h 
     mov es:[si+0A0H],al 
     mov es:[si+0A0H+1],24h
     mov es:[si+140H],al
     mov es:[si+140H+1],71h
     add si,2 
     inc di 
     loop s 

               
     mov ax,4c00h 
     int 21h 
code ends 
end start
shaoyongwei
[第28楼]   [ 回复时间:2011-09-02 23:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-21 16:44
没调试 不知道对不对!!
assume cs:code,ds:data
data segment

db 'welcome to masm!'

data ends
code segment

strat:mov ax,data
      mov ds,ax
      mov bx,0 \ 初始化数据段,定义数据段用的偏移变量\
      
      mov ax,0b872h
      mov es,ax
      mov si,0 \初始化附加段,定义附加段的偏移量\
     mov cx,16

  s:  mov al,[bx]
      mov ah,02h  \将数据和颜色送入ax、
      mov es:[si],ax \将数据和颜色送入第1行内存\
    
     mov ah,24h
     mov es[si+0a0h],ax\送入第2行\
     
     mov ah,71h
     mov es:[si+0a0+0a0],ax \送入第3行\

   inc bx
    add si,2   
              
      loop s

mov ax,4c00h
  int 21h

 code ends
end start
chinatree
[第29楼]   [ 回复时间:2011-09-02 23:38 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
代码不错,不过肯定编译不通过的,因为你把c注释符号用上了,编译器不能识别的,要用英文分号。
svking
[第30楼]   [ 回复时间:2011-10-18 10:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-13 17:01
很好的方式,用ax的低位存字符,高位存属性,然后一次mov。很漂亮
dengyuquan
[第31楼]   [ 回复时间:2011-11-29 09:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-11-21 17:57
我 27行就出来了 但是有一点小问题 想不明白  
麻烦帮助看看
http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1010&qkSg=2&qID=63943&readSg=1
q382267644
[第32楼]   [ 回复时间:2011-12-07 14:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-12-02 22:19
把横行变成竖行怎么办啊,会的别藏着啊,我们老师故意难为我们。
tomato
[第33楼]   [ 回复时间:2011-12-08 08:52 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
每一列写成一个循环。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved