彙編語言實驗六

編程,將 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    
相關文章
相關標籤/搜索