汇编中循环嵌套
? ? ? ? ? 先來看一段代碼:
assume cs:codesg,ds:datasg,ss:stacksg datasg segmentdb 'ibm 'db 'dec 'db 'dos 'db 'vax ' datasg endsstacksg segmentdw 0,0,0,0,0,0,0,0 stacksg endscodesg segmentstart:mov ax,stacksgmov ss,axmov sp,16mov ax,datasgmov ds,axmov bx,0mov cx,4s0:push cx ;將外層循環的cx值壓棧,在需要暫存數據時,一般選擇棧mov si,0mov cx,3 ;設置內循環次數s:mov al,[bx+si]and al,11011111b ;將字母變成大寫mov [bx+si],al ;變成大寫重新賦值回去inc si ;si自增,bx的值一直沒變loop sadd bx,16 ;程序的數據段是一塊連續的內存,且bx一直為0,加上16指向下一個字符串pop cx ;將棧頂的值傳入寄存器cx中loop s0mov ax,4c00Hint 21H codesg ends end start? ? ?上述的程序的作用是將datasg段中每個單詞改為大寫字母,每個字符串的長度為16。程序先指定ss:sp和ds:bx。程序中[bx+si]可以表示一個地址,前面說過[bx+idata],其中idata是一個常數,現在這個si是一個寄存器,[bx+si+idata]用2個變量和一個常量表示一個地址,這樣也是允許的。
? ? 因為要用cx設置內循環次數,所以要外循環的cx用棧保存起來,內循環完成之后再pop,pop后cx自減,然后再被push入棧,這樣完成循環嵌套。下面來debug一下。
? ?程序加載時,可以看到程序的字符串和棧段
? 程序運行后,可以看到字符串發生了改變。
? ?
?
?
?
?
參考資料:<<匯編語言>>王爽
總結
- 上一篇: 汇编中类似数组的寻址方式
- 下一篇: 汇编中的跳跃指令