. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
主题 : :  实验9 自己写的代码,自以为很精炼! 不足之处 大家 指正。  [已解决] 回复[ 10次 ]   点击[ 414次 ]  
kafka
[帖 主] [ 发表时间:2008-03-19 15:18 ] 
荣誉值: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,当然你 也可以有不同的偏移地址,可以在程序里改变。
skygoder
[第7楼] [ 回复时间:2008-03-31 15:27 ] 
荣誉值:2
信誉值:0
注册日期:2008-03-10 10:19
我运行了后,没任何反应
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved