不同的定址方式的應用 將每行的單詞都變成大寫

2021-10-10 09:24:16 字數 3364 閱讀 8136

程式設計,將data段中每個字母改為大寫字母

;程式設計,將data段中每個字母改為大寫字母

assume cs:code,ds:data

data segment

;'0123456789abcdef'

db 'ibm '

;ibm

db 'dec '

db 'dos '

db 'vax '

; 要四行,每一行有三個字母需要變成大寫,怎麼做?

; 首先想怎麼把第一行的三個字母變成大寫

data ends

code segment

start:

mov ax,data

mov ds,ax

mov bx,0

mov cx,4 ;執行四行

uprow: mov dx,cx ;☆☆☆☆☆可以使用我們沒有使用過的暫存器,把cx臨時儲存起來

mov cx,3

mov si,0

upletter:

mov al,ds:[bx+si]

;把第一行的三個字母變成大寫

and al,11011111b

mov ds:[bx+si],al

inc si

loop upletter

mov cx,dx ;把cx從dx中拿回來 ;用dx恢復cx

add bx,16 ;每迴圈一行,bx要加16

loop uprow ;外層迴圈的loop指令將cx中計數值-1

mov ax,4c00h

int 21h

code ends

end start

方法1、我們應該在每次開始內層迴圈的時候,將外層迴圈的cx中的數值儲存起來,在執行外層迴圈loop指令前,再恢復外層迴圈cx的數值。可以用暫存器dx來臨時儲存cx中的數值

方法2、放入棧中

在cpu指令loop指令的時候,要進行兩步操作:

①cx=cx-1

②判斷cx中的值,不為零則跳轉☞標號處執行程式,如果為0則向下執行。

涉及到了loop的巢狀

改進:暫存器是有限的,所以可以宣告乙個值:dw 0,將cx儲存在這裡,40h

assume cs:code,ds:data

data segment

;'0123456789abcdef'

db 'ibm '

;ibm

db 'dec '

db 'dos '

db 'vax '

dw 0

; 要四行,每一行有三個字母需要變成大寫,怎麼做?

; 首先想怎麼把第一行的三個字母變成大寫

data ends

code segment

start:

mov ax,data

mov ds,ax

mov bx,0

mov cx,4 ;執行四行

uprow: mov ds:[40h],cx ;將外層迴圈的cx值儲存在data:40h單元中

mov cx,3 ;cx設定為內層迴圈的次數

mov si,0

upletter:

mov al,ds:[bx+si]

;把第一行的三個字母變成大寫

and 11011111b

mov ds:[bx+si],al

inc si

loop upletter

mov cx,dx:[40h]

;用data:40h單元中的值恢復cx

add bx,16 ;每迴圈一行,bx要加16

loop uprow ;外層迴圈的loop指令將cx中的計數值-1

mov ax,4c00h

int 21h

code ends

end start

一般來說,在暫存資料的時候,我們都應該使用棧更好的方法:用棧存放

;程式設計,將data段中每個字母改為大寫字母

assume cs:code,ds:data

data segment

;'0123456789abcdef'

db 'ibm '

;ibm

db 'dec '

db 'dos '

db 'vax '

dw 0

data ends

stack segment

dw 0,0,0,0 ;定義乙個段,用來做棧段

dw 0,0,0,0

dw 0,0,0,0

dw 0,0,0,0

stack ends

code segment

start:

mov ax,stack

mov ss,ax

mov sp,32

mov ax,data

mov ds,ax

mov bx,0

mov cx,4 ;執行四行

uprow: push cx ;將外層迴圈的cx值壓棧

mov cx,3 ;cx設定為內層迴圈的次數

mov si,0

upletter:

mov al,ds:[bx+si]

;把第一行的三個字母變成大寫

and 11011111b

mov ds:[bx+si],al

inc si

loop upletter

pop cx ;從棧頂彈出原cx的值,恢復cx

add bx,16 ;每迴圈一行,bx要加16

loop uprow ;外層迴圈的loop指令將cx中的計數值-1

mov ax,4c00h

int 21h

code ends

end start

一般來說,在需要暫存資料的時候,我們都應該使用棧

組合語言程式設計 實驗3 不同定址方式的靈活應用

1.實驗1 立即定址方式的使用 我們進入debug模式,然後輸入a,準備執行指令 首先我們在介面輸入mov al,6,mov ax,12af。這裡我們就往暫存器裡面存入了這兩條指令 然後我們按回車,進入命令模式,我們輸入u0100 0105這個命令可以檢視位址 0100 0105 的指令資訊 這個也...

8086 的定址方式

我們知道 指令 的組成 是有操作碼和運算元 組成的 運算元的 又有哪些呢 總體上有四種 指令本身提供 暫存器提供 儲存器提供 或者是輸入輸出埠提供 反過來 操作結果的去向 也只有三種 暫存器 儲存器 或者 輸出埠 綜合一下 總共有四種 定址方式 立即數定址 暫存器定址 儲存器定址 輸入 輸出埠定址 ...

硬碟的定址方式

什麼是chs定址 很久以前,硬碟的容量還非常小的時候,人們採用與軟盤類似的結構生產硬碟。也就是硬碟碟片的每一條磁軌都具有相同的扇區數。由此產生了所謂的csh 3d引數 disk geometry 即磁頭數 heads 柱面數 cylinders 扇區數 sectors 以及相應chs定址方式。chs...