代码如下:
assume cs:code,ss:stack,ds:data
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
data segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
data ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,10H
mov ax,data
mov ds,ax
mov cx,4
mov bx,0
s: push cx
mov cx,4
mov si,3
s0:
mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s0
add bx,10H
pop cx
loop s
mov ax,4c00h
int 21h
code ends
end start
ps:2个循环嵌套.注意保存cx的值.我保存在栈中.所以代码中一开始就开辟了一个栈空间.外层循环主要是对4行字母进行循环.内层循环主要是对每个字母的第3-6位进行循环.利用and 11011111b.将该字母转化为大写字母.所以外层循环的次数为4次.进入外层循环时首先需要把cx值保存起来.一次循环完后需要从栈中恢复cx的值以便下次循环.所以s循环开始时要push cx,s循环结束时要pop cx.内层循环时,si的值从3变化到6,也就是每行字母的前4个字母.
我觉得这题比较复杂.我搞了好久.结合答案才弄懂..可能人笨了点..
- [游客] 过程的回味真是无穷! 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 11:29 ]
刚开始是这样的,弄得慢没关系,只要你努力,总会有结果的。思维是锻炼出来的,经过这程序,再有类似的思维逻辑就不会觉得复杂了。