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 中定義了 4 個字串,為了便於程式的編寫,我們可以將這 4 個字串的長度都設為 16 位元組。

因為它們是連續存放的,所以我們可以將這 4 個字串看作一個 4 行 16 列的二維陣列(注意這裡的因果關係)。

如上圖所示,需要完成一個 4 * 4 次的二重迴圈,用變數 R 定位行,常量 3 定位每行要修改的起始位置,變數 P 定位相對於起始列要修改的列。

所以定址方式應該是 [ bx + si + idata ] 的方式。即:可以用 bx 來作變數 R,si 來作變數 P,用 [ bx + 3 + si ] 的方式來對目標單元進行定址。

得到彙編程式如下:

 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