《汇编语言·第三版》--王爽
1 问题
编程,将datasg段中的每个单词的前4个字母改为大写字母。
assume cs:codesg, ss:stacksg, ds:datasg
stacksg segment dw 0,0, 0, 0, 0, 0, 0, 0 stacksg ends
datasg segment db '1. display ' db '2. brows ' db '3. replace ' db '4. modify ' datasg ends
codesg segment start:
codesg ends end start |
Datasg中的数据的存储结构如下图:
Figure1. datasg中数据的存储结构
2 代码
1. assume cs:codesg, ss:stacksg, ds:datasg 2. 3. stacksg segment 4. dw 0, 0, 0, 0, 0, 0,0, 0 5. stacksg ends 6. 7. 8. datasg segment 9. db '1. display ' 10. db '2. brows ' 11. db '3. replace ' 12. db '4. modify ' 13. datasg ends 14. 15. 16. codesg segment 17. start: 18. mov ax, datasg 19. mov ds, ax ;ds指向数据段datasg 20. 21. mov ax, stacksg 22. mov ss, ax 23. mov sp, 2 24. 25. mov bx, 0 ;指向datasg每行 26. 27. mov cx, 4 ;四行,一共循环四次 28. 29. s0: push cx ;外层循环数cx值缓存到stack的第一个字节单元处 30. 31. mov si, 0 ;用来索引每行的前四个字母 32. mov cx, 4 ;内层循环中的循环次数,对应每行的前四个字母 33. s1: mov al, 3[bx + si] ;[bx + si +3] 34. and al, 11011111b 35. mov 3[bx + si], al 36. 37. inc si 38. loop s1 39. 40. add bx, 16 ;下一行字符串 41. pop cx 42. loop s0 43. 44. mov ax, 4c00h 45. int 21h 46. codesg ends 47. end start |
3 调试
(1) stacksg和datasg段地址
stacksg段地址为076B,datasg段地址为076A。
(2) 查看datasg段内容
(3) 执行程序后看datasg段内容
4 总结
[bx+si(di) + idata]可以更加灵活的访问内存。像此次题目中具有多行,每行中具有固定的偏移,每行还需要遍历的情况就可以使用[bx+si(di) + idata]的形式来访问内存。对于更简单的情况,或许只需要用到[bx],[bx + idata]或[bx + si(di)]的形式来访问内存。对于更复杂的情况,或许还会同时用上si和di。