更灵活的定位内存地址的方法
汇编大小写转换
1 | assume cs:code,ds:data |
使用[bx+idata]的方法优化程序
1 | assume cs:code,ds:data |
SI AND DI
si和di不能分成2个8位寄存器,也就是不能进行mov al,[si]
,mov al,[di]
这样的操作,下面写一个栗子~
1 | assume cs:codesm,ds:datasg |
上面的代码可以看出si,di递增为2 ,循环次数也缩短了一倍,用16位寄存器进行内存单元之间的数据传送一次复制2 个字节,一共循环八次。
再次优化:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22assume cs:codesm,ds:datasg
datasg segment
db 'welcome to masm!'
db '................'
datasg ends
codesm segment
start: mov ax,datasg
mov ds,ax
mov si,0
mov cx,8
s: mov ax,[si]
mov [si+16],ax
inc si,2
loop s
mov ax,4c00h
int 21
codesm ends
end start
将字符串头一个字母改为大写
1 | assume cs:codesg,ds:datasg |
嵌套循环(把datasg每个单词改为大写)
1 | assume cs:codesg,ds:datasg |
讲道理汇编的嵌套循环有点不习惯….
这只是2层嵌套 如果更多嵌套则寄存器不够用,这时候我们就不能用寄存器来暂存CX了
用栈来处理cx缓存问题
将datasg数据段每个单词前4个字幕改为大写
1 | assume cs:codesg,ds:datasg,ss:stacksg |