书中遇到这样一个问题,令人眼前一亮的是第二种解法,看题:
编程,向内存0:200~0:23f依次传递数据0~63(3fh),程序中只能使用9条指令,9条指中包括“mov ax,4c00h”和“int 21h”。
这不很简单吗,设置好ss,sp,循环次数,然后循环push就行了,下面是传统的做法:
assume cs:code
code segment
start:
mov ax,20h
mov ds,ax //设置数据段为20h
mov bx,0 //bx从0开始,每次循环都增加1
mov cx,40h //循环次数
s: mov [bx],bl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
执行完后
下面看另一种做法:
assume cs:code
code segment
start:
mov bx,20h
mov ss,bx //0:200h-0:23fh,可以将栈段设为20h,然后依次
//push
mov sp,40h //初始时,堆栈指针应指向栈底
mov bx,3f3eh //以字为单位,一次push两个字节,第一次push
//就将0:23fh处设置为3f,0:23eh处设置为3e
mov cx,32 //这样循环次数减少一半
s: push bx
sub bx,202h //比如3f3eh减去202h,就是3d3c
loop s
mov ax,4c00h
int 21h
code ends
end
由于上一个程序已经将设置好了,所以重新打开DoxBox
继续进行上面的操作,只不过程序不同,看看结果
想法很独特,相信大多数人都是一下就想到传统的做法对吧,不要束缚自己的想法,非要按照某种规则,按部就班的编程,要有想法,有创意