|
主题 : : 以单词为单位完成‘实验9’ [待解决] |
回复[ 1次 ]
点击[ 214次 ] | |
荣誉值:0
信誉值:0
注册日期:2012-09-16 00:19 |
我的思路是以单词为单位进行两层循环.一次外层循环完成一个单词。每个单词因为长度不同那么循环的次数就不同,我把他们的循环次数分别压入栈中并在每次外层循环中把相应的pop到cx中。
我用di存放属性的偏移地址,3个单词他们的属性都不同但是它们都存储在一个地址连续的空间中。所以可以在每次外层循环之后增加di,这样就可以实现每个单词拥有不同的属性。
assume cs:codesg
data segment
;db 77h,02h,65h,02h,6ch,02h,63h,02h,6fh,02,6dh,02h,65h,02h,20h,0h ;welcome
;db 74h,24h,6fh,24h,20h,0h ;to
;db 6dh,71h,61h,71h,73h,71h,6dh,71h ;masm!
db 'welcome to masm!'
db 02h,24h,71h
data ends
stack segment
dw 8 dup (0)
stack ends
codesg segment
start:
mov ax,data
mov ds,ax
mov ax,0b872h
mov es,ax
mov ax,stack
mov ss,ax
mov sp,16
mov di,16 ;三个属性的位置从16开始并且是连续的
mov bx,0
mov si,0
mov cx,3 ;以单词为单位进行
mov ax,5 ;将每个单词循环的次数压入栈中
push ax
mov ax,2
push ax
mov ax,7
push ax
s:
mov ax,cx ;将内层循环的次数放入cx中并把外层循环的当前次数压入栈
pop cx
push ax
s1:mov al,[si] ;将ASCII与属性合并成一个字
mov ah,[di]
mov es:[bx],ax
inc si
add bx,2
loop s1
inc di
inc si ;跳过空格
add bx,2
pop cx ;恢复外层循环的次数
loop s
mov ax,4c00h
int 21h
codesg ends
end start | | |