在第七章里最后一个问题, 书里的思路是先定位行后定位列的完成4X4的两层循环。 我的这个方法是采用【逐列】的算法。即,先用si定位列, 用bx来定位行(思路跟书里基本一致),但是内外循环是相反的, 即, 书里bx作为外层循环的计数, 而我这里用si作为大循环的计数。 呵呵,我不善于言语, 还是上代码吧:
--------------------------------------------------------------------------------
root@yeah /cygdrive/d/asm
$ cat 79a.asm
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov si,3 ;初始化列, 从第三列开始逐列循环
mov cx,4 :需要变化的是4个字符
s: push cx ;保存外层循环计数器
mov cx,4 ;内层循环计数开始
mov bx,0 ;从第一行开始, 地址为ds:bx
s0: mov al,[bx+si] ;开始与运算
and al,11011111b ;
mov [bx+si],al ;
add bx,10h ;由于逐列处理, bx的值需加10h
loop s0 ;当cx不为零继续循环,否则, 进入下一步。
pop cx ;恢复cx的值
inc si ;下一列
loop s ;同s0
mov ah,4ch
int 21h
codesg ends
end start
root@yeah /cygdrive/d/asm
$
--------------------------------------------------------------------------
实验结果略。
简单的说, 书里的思路是先行后列, 我的思路是先列后行, 算个对自己的一个练习吧。
有不对的地方, 还希望大家指正。
(另, 对栈段的空间是不是有些大了点呢, 这程序没用几个字节呀) |