|
主题 : : 实验9 自己写的代码,自以为很精炼! 不足之处 大家 指正。 [已解决] |
回复[ 10次 ]
点击[ 413次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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,当然你 也可以有不同的偏移地址,可以在程序里改变。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-03-19 21:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21 |
楼主倒是挺能观察,其实就是将160分解成了10H*10,是不是这个理?
楼主的处理方式挺有意思。
顶一个! | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-03-23 15:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:20
注册日期:2008-02-27 16:26 |
"空出多个字节呢?空出(80-16*3)/2 个即:16个字符也就是 32个字节,用16进制表示为20h。 "
为什么这样算 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-03-24 09:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23 |
|
|
|
|
|
[第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 | | |
|
|
|
|
[第7楼]
[ 回复时间:2008-03-31 15:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2008-03-10 10:19 |
|
|
|
|
|
[第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
我运行后没有反应,是怎么回事,请指教 | | |
|
|
|
|
[第9楼]
[ 回复时间:2008-04-01 18:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:14
信誉值:0
注册日期:2008-03-23 07:47 |
运行了之后没有第1个W字母啊其他的都在....没个都缺W | | |
|
|
|
|
[第10楼]
[ 回复时间:2008-04-06 15:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:6
注册日期:2007-09-18 20:38 |
此贴由 贴主 于 [ 2008-04-06 15:55 ] 结贴。 结贴原因:问题已解决 | | |
|