. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  用单循环编出的实验九  [待解决] 回复[ 9次 ]   点击[ 528次 ]  
qinaode12
[帖 主]   [ 发表时间:2008-12-14 16:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2008-09-09 21:27
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 bx,0
      mov si,0
      mov cx,16
      
    s:mov al,[bx]
      mov ah,02h
      mov es:[si],ax      ;三行中的第一行
      mov ah,24h
      mov es:[si+0a0h],ax ;三行中的第二行(同一列,相邻两行相差160个字符,段地址相差a0h)
      mov ah,71h
      mov es:[si+140h],ax ;三行中的第三行
      inc bx
      add si,2
      loop s
    
     mov ax,4c00h
     int 21
code ends
end start

请大家评论一哈!!!
qinaode12
[第1楼]   [ 回复时间:2008-12-14 20:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2008-09-09 21:27
不好意思程序返回处写掉了一个h。  int 21 应改为 int 21h!呵呵!
qinaode12
[第2楼]   [ 回复时间:2008-12-14 20:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2008-09-09 21:27
正确的程序应该是:
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 bx,0 
      mov si,0 
      mov cx,16 
       
    s:mov al,[bx] 
      mov ah,02h 
      mov es:[si],ax      ;三行中的第一行 
      mov ah,24h 
      mov es:[si+0a0h],ax ;三行中的第二行(同一列,相邻两行相差160个字符,段地址相差a0h) 
      mov ah,71h 
      mov es:[si+140h],ax ;三行中的第三行 
      inc bx 
      add si,2 
      loop s 
     
     mov ax,4c00h 
     int 21h
code ends 
end start
qinaode12
[第3楼]   [ 回复时间:2008-12-14 20:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2008-09-09 21:27
程序思路主要是采用以列的方式去修改显存。因为同列的是相同的字母,AScii码相同,知识属性值不同而已。所以每次循环只需要,作一次取字符ascii码的操作(mov al,[bx]),然后对相应属性值设置后,就可以分别送入同列三行的地址中:    1行:mov ah,02h mov es:[si],as           (ax 高8位存属性值,低8位存ascii码值)
              2行:mov ah,24h  mov es:[si+0a0h],ax 
              3行:mov ah,71h  mov es:[si+140h],ax

这样16次循环后,就完成了任务。如过采用行的方式,修改完一行之后在去修改第二行,第三行。这样,就必须重复做取三次字符Ascii码的操作。这样就必须用双重循环嵌套的方式才能完成。

采用双重循环方式的代码:
assume cs:code,ds:data,ss:stack 
data segment 
  db 'welcome to masm!' 
  db 02h,24h,71h 
data ends 
stack segment 
  dw 0,0,0,0,0,0,0,0 
stack ends 
code segment 
start:mov ax,data 
      mov ds,ax 
      mov di,0 
      mov ax,0b872h 
      mov cx,3 
      mov sp,30h 
    s:mov bx,0 
      mov si,0 
      mov es,ax 
      push ax 
      push cx 
      mov cx,16 
      mov ah,[di+10h] 
    s1:mov al,[bx] 
       mov es:[si],ax 
      inc bx 
      add si,2 
      loop s1 
      pop cx 
      pop ax 
      add ax,0ah 
      inc di 
      loop s 

      mov ax,4c00h 
      int 21h 
code ends 
end start
zcouyangpeng
[第4楼]   [ 回复时间:2009-01-02 19:47 ]   [引用]   [回复]   [ top ] 
荣誉值:35
信誉值:44
注册日期:2008-09-03 21:36
行模式,列模式

哪种简单用那种

多用用就能熟能生巧
zhy7901
[第5楼]   [ 回复时间:2009-11-15 16:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-03-20 23:24
高,实在是高。
heiok.com
[第6楼]   [ 回复时间:2009-11-23 17:27 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2009-10-21 20:01
我的:

assume cs:code,ds:data
data segment
        db 'welcome to masm!'
data ends
code segment
        start:mov ax,data
                mov ds,ax
                mov ax,0b800h
                mov es,ax
                mov bp,0720h
                mov bx,07c0h
                mov di,0860h                
                mov si,0
                mov cx,16
             s:mov al,[si]
                mov ah,02h
                mov es:[bp],ax
                mov ah,24h
                mov es:[bx],ax
                mov ah,0F1h
                mov es:[di],ax
                inc si
                add bp,2
                add bx,2
                add di,2
                loop s

                mov ax,4c00h
                int 21h
code ends
end start
momo023
[第7楼]   [ 回复时间:2009-11-24 21:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-08 19:29
写这个程序时一直想的是怎样用转移来做 思路很简单 这个是我的程序  就是长了点 
assume cs:code ds:data ss,stack

data segment 
   db 'welcome to masm!'
data ends

stack segment
   dw 0,0,0
stack ends   
 
code segment      
     start: mov ax,data
            mov ds,ax
            mov ax,0b800h
            mov es,ax
            
            push offset s3
            push offset s2
            push offset s1 
               
            mov ah,02h
            mov di,0
            
         s0:mov bx,0            
            mov cx,16         
         s:mov al,[bx] 
            mov es:[di],ax
            inc bx
            add di,2
            loop s
            pop si
            jmp si
            
         s1:mov ah,24h
            mov di,0a0h
            jmp s0

         s2:mov ah,71h
            mov di,140h
            jmp s0
            
         s3:mov ax,4c00h
            int 21h            
code ends
end start
dos
[第8楼]   [ 回复时间:2010-01-06 23:13 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-14 13:42
行模式,列模式,学习了
okenny
[第9楼]   [ 回复时间:2010-04-19 16:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-12-18 17:03
写这个程序时一直想的是怎样用转移来做 思路很简单 这个是我的程序  就是长了点 
assume cs:code ds:data ss,stack

data segment 
   db 'welcome to masm!'
data ends

stack segment
   dw 0,0,0
stack ends   
 
code segment      
     start: mov ax,data
            mov ds,ax
            mov ax,0b800h
            mov es,ax
            
            push offset s3
            push offset s2
            push offset s1 
               
            mov ah,02h
            mov di,0
            
         s0:mov bx,0            
            mov cx,16         
         s:mov al,[bx] 
            mov es:[di],ax
            inc bx
            add di,2
            loop s
            pop si
            jmp si
            
         s1:mov ah,24h
            mov di,0a0h
            jmp s0

         s2:mov ah,71h
            mov di,140h
            jmp s0
            
         s3:mov ax,4c00h
            int 21h            
code ends
end start
------------------
回复:不明白你的SI是从哪来的。。。。。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved