此题没啥难度.自己肯花时间多调就一定ok,贴出我的方法.可能有些繁琐.不过结果ok.呵呵.
assume ss:stack
stack segment
db 32 dup (0) ;中转栈
dw 0 ;保存cx计数器
stack ends
data segment
dw 'w','e','l','c','o','m','e',' ','t','o',' ','m','a','s','m','!'
db 00000010b,00100100b,01110001b ;三种颜色
data ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,32
mov ax,data
mov ds,ax
mov ax,0B872H ;屏幕的正中间是第11行第64个字符.一共25行.就是0-24行.除去要显示的3行.还22行.所以就是0-10行,11-13,14-24
;一列共80个字.160个字节.除去要显示的welcome to masm!+颜色=32个字节.还128个字节.所以就是第64个字节开始.
mov es,ax
mov di,0
mov cx,3
mov bp,32
s3:
mov ss:[32],cx
mov bx,30
mov si,31
mov cx,16
s: push ds:[bx] ;把welcome to masm! 逆序入栈,并把对应的颜色代码也全部mov进去
mov al,ds:[bp]
mov BYTE ptr ss:[si],al
sub bx,2
sub si,2
loop s
mov cx,16
mov bx,0
s1:pop es:[bx+di] ;顺序出栈.一行Welcome to masm!就搞定.
add bx,2
loop s1
add di,0A0H
mov cx,ss:[32]
inc bp
loop s3 ;然后循环3次.每次出栈保存的地方+160个字节,就是add di0A0H,一行是160个字节.
mov ax,4c00h
int 21h
code ends
end start
- [游客] 过程的回味真是无穷! 08/05 17:57
- [kingwrcy] 多谢提示.已经过去接近4个月了.由于工作原因,汇编一直没碰了.哎.准备重新温习下. 07/31 15:09
- [younggay] 分析没有问题。加油! 04/15 16:43
- [younggay] 回答正确。 04/15 16:41
- [游客] 不知道为什么用c做code段老是报错.改成才c1就可以了.莫名其妙 我用的编辑器是masmp 04/15 15:48
- [游客] 嗯,说的很对。这里的栈操作就是一个一个的完成数据移送。 04/15 15:44
- [游客] 刚开始是这样的,弄得慢没关系,只要你努力,总会有结果的。思维是锻炼出来的,经过这程序,再有类似的思维 04/15 11:29
- [游客] 得到别人的技术,不如学会别人的思维方式。从自己参考别人的代码过程,要反思自己思维上的不足。 完 04/15 11:25
- [游客] 嗯。分析的很正确。 注意体会jmp的执行原理。 04/15 11:21
- [游客] 调程序,尤其是汇编程序,耐心是必备的。 04/15 09:37
[ 游客 发表于 2009-04-15 09:37 ]
调程序,尤其是汇编程序,耐心是必备的。