. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9 自己写的代码,自以为很精炼! 不足之处 大家 指正。  [已解决] 回复[ 10次 ]   点击[ 413次 ]  
kafka
[帖 主]   [ 发表时间:2008-03-19 15:18 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:6
注册日期:2007-09-18 20:38
code: 

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 di,0
         mov si,7a0h
         mov cx,16

      s: mov ax,[di]
         mov es:[si],ax
         mov es:[si+32],ax
         mov es:[si+64],ax
         inc si
         mov byte ptr es:[si],02h
         mov byte ptr es:[si+32],24h
         mov byte ptr es:[si+64],71h
         inc di
         inc si
         loop s

         mov ax,4c00h
         int 21h

code ends
end start

许多人都问 怎么确定 屏幕中间的位置,我的方法很简单,只要是找到规律就很容易。先要确定字符串在屏幕的第几行,一共25行,当然是第13行。到底偏移地址是多少呢,可以找出规律:
第一行:000~09f
第二行:0a0~13f
第三行:140~1df

不知道大家看出来没有,第二行(即n=2)开始处前两个数字 0a=10*(2-1),后面的10*(2-1)转化为16进制后是0a,看看 第三行(n=3),10*(3-1)转化成16进制后是14,我们找到规律了!10*(n-1)转化为16进制是第n行的开始处的头两数(第三个数都是0)。
好了,我们计算屏幕中间的第13行的开始处 :10*(13-1)转化成16进制是 78h,后面加一个0为780h。
我们知道了第13行的开始处,但是题目要求我们在屏幕中间输出,开头必须空出一些字节,空出多个字节呢?空出(80-16*3)/2 个即:16个字符也就是 32个字节,用16进制表示为20h。

最后偏移地址为 :7a0h=780h+20h,当然你 也可以有不同的偏移地址,可以在程序里改变。
wdm
[第1楼]   [ 回复时间:2008-03-19 21:42 ]   [引用]   [回复]   [ top ] 
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21
楼主倒是挺能观察,其实就是将160分解成了10H*10,是不是这个理?
楼主的处理方式挺有意思。
顶一个!
yunhai13
[第2楼]   [ 回复时间:2008-03-23 15:26 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:20
注册日期:2008-02-27 16:26
"空出多个字节呢?空出(80-16*3)/2 个即:16个字符也就是 32个字节,用16进制表示为20h。 "

为什么这样算
jhszcn
[第3楼]   [ 回复时间:2008-03-23 19:29 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
学习了,我觉得这样才对
我觉得这样才对~!
assume cs:codesg,ds:datasg

datasg segment
        db 'welcome to masm!'
datasg ends

codesg segment
start:
        mov ax,datasg
        mov ds,ax
        mov ax,0b800h
        mov es,ax
        mov bx,0
        mov si,720h
        mov cx,16

s:        mov ax,[bx]
        mov es:[si],ax
        mov es:[si+160],ax
        mov es:[si+320],ax
        inc si
        mov byte ptr es:[si],02h
        mov byte ptr es:[si+160],24h
        mov byte ptr es:[si+320],71h
        inc si
        inc bx
        loop s
        
        mov ax,4c00h
        int 21h
codesg ends

end start
kafka
[第4楼]   [ 回复时间:2008-03-23 23:02 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:6
注册日期:2007-09-18 20:38
jhszcn  说的的确是,我的屏幕中间输出的是连续 3个 welcome to masm! 字符串,我是这样想的。对这个程序改进如下,把 mov es:[si],ax 以及 一下两条指令 中的ax 改成al 更容易理解,虽然ax 也侥幸正确(嘿嘿),还有按照  jhszcn 的说法,我的方法依然适用。具体如下:

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 di,0
         mov si,6e0h
         mov cx,16

      s: mov al,[di]
         mov es:[si+64],al
         mov es:[si+64+160],al
         mov es:[si+64+320],al
         inc si
         mov byte ptr es:[si+64],02h
         mov byte ptr es:[si+64+160],24h
         mov byte ptr es:[si+64+320],71h
         inc di
         inc si
         loop s

         mov ax,4c00h
         int 21h

code ends
end start
jhszcn
[第5楼]   [ 回复时间:2008-03-24 09:19 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
是的:)
fenglixin70953
[第6楼]   [ 回复时间:2008-03-28 00:07 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2008-01-23 09:03
assume cs:code
data segment
db 'welcome to masm!'
data ends
code segment
start: mov ax,data
       mov ds,ax
       mov ax,0b800h
       mov es,ax
       
       mov bx,0
       mov bp,720h
       mov di,0
       
       mov cx,16
     s:mov al,[bx]
       mov es:[bp][di],al
       mov byte ptr es:[bp][di+1],2h
       
       mov es:0a0h[bp][di],al
       mov byte ptr es:0a0h[bp][di+1],24h
       
       mov es:0a0h[bp].0a0h[di],al
       mov byte ptr es:0a0h[bp].0a0h[di+1],71h
       
       inc bx
       add di,2
       loop s
       mov ax,4c00h
       int 21h
       
       code ends
       end start
skygoder
[第7楼]   [ 回复时间:2008-03-31 15:27 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2008-03-10 10:19
我运行了后,没任何反应
skygoder
[第8楼]   [ 回复时间:2008-03-31 15:29 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2008-03-10 10:19
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
data ends
stack segment
dw 8 dup (0)
stack ends
code segment
start:mov ax,stack
      mov ss,ax
      mov sp,8
    mov ax,data
    mov ds,ax
    mov ax,0b800h
    mov es,ax
    mov bx,0
    mov cx,100
    mov si,0
    mov dx,0
s1:push cx
    mov cx,16

s:   mov al,[bx]
    mov es:[bx+si],al
    mov es:[bx+1+si],byte ptr 0cah
    add bx,1
    inc si
   loop s
  add dx,0a0h
  mov es,dx
  pop cx
   loop s1

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


我运行后没有反应,是怎么回事,请指教
wangzh001
[第9楼]   [ 回复时间:2008-04-01 18:59 ]   [引用]   [回复]   [ top ] 
荣誉值:14
信誉值:0
注册日期:2008-03-23 07:47
运行了之后没有第1个W字母啊其他的都在....没个都缺W
kafka
[第10楼]   [ 回复时间:2008-04-06 15:55 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:6
注册日期:2007-09-18 20:38
此贴由 贴主 于 [ 2008-04-06 15:55 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(wdm):4分   2楼(yunhai13):2分   3楼(jhszcn):4分   6楼(fenglixin70953):2分   7楼(skygoder):2分   9楼(wangzh001):2分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved