|
主题 : : 实验9 自己写的代码,自以为很精炼! 不足之处 大家 指正。 [已解决] |
回复[ 10次 ]
点击[ 414次 ] | |
|
|
|
|
[帖 主] [ 发表时间: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,当然你 也可以有不同的偏移地址,可以在程序里改变。 | | |
|
|
|
|
[第4楼] [ 回复时间:2008-03-23 23:02 ] | |
荣誉值: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 | | |
|