編程,將 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 中定義了 4 個字符串,爲了便於程序的編寫,咱們能夠將這 4 個字符串的長度都設爲 16 字節。oop
由於它們是連續存放的,因此咱們能夠將這 4 個字符串看做一個 4 行 16 列的二維數組(注意這裏的因果關係)。spa
如上圖所示,須要完成一個 4 * 4 次的二重循環,用變量 R 定位行,常量 3 定位每行要修改的起始位置,變量 P 定位相對於起始列要修改的列。code
因此尋址方式應該是 [ bx + si + idata ] 的方式。即:能夠用 bx 來做變量 R,si 來做變量 P,用 [ bx + 3 + si ] 的方式來對目標單元進行尋址。blog
獲得彙編程序以下:內存
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 datasg segment 8 db '1. display ' 9 db '2. brows ' 10 db '3. replace ' 11 db '4. modify ' 12 datasg ends 13 14 codesg segment 15 start: mov ax,stacksg 16 mov ss,ax 17 mov sp,1618 19 mov ax,datasg 20 mov ds,ax ;準備好要訪問的內存數據 21 22 mov bx,0 ;因爲已經設置好ds的值,因此開始偏移地址bx應爲0 23 mov cx,4 24 25 s0: push cx 26 mov si,0 ;我一開始寫的是 mov si,[bx+3],如此的話,在訪問內存時就不用加上再次加上 常量 3 了 27 mov cx,4 ;肯定內循環的次數 28 29 s: mov al,[bx+si+3] 30 and al,11011111b 31 mov [bx+si+3],al 32 inc si 33 loop s 34 35 add bx,16 36 pop cx ;從新從棧中獲取外循環次數 37 loop s0 ;判斷 38 39 mov ax,4c00h 40 int 21h 41 codesg ends 42 43 end start