1. 程式人生 > >匯編語言——[bx]和loop指令

匯編語言——[bx]和loop指令

nbsp 編譯 執行 nds code 之前 指令 loop assume

[bx]

由於在編譯器中mov AX,[0]指令會被編譯器認為是mov AX,0所以引入[bx]的概念

mov [bx],AX的意思是將(ds)*16+(bx)內存位置的值賦給AX

用法和之前的ds[address]一樣

小Tips

 1 ; [bx]的使用方法
 2 mov ax,1000H
 3 
 4 mov bx,2000H     
 5 
 6 mov ds,ax    ; 將ds數據段寄存器賦值為2000H 
 7 
 8 mov [bx],ax    ; 將ax寄存器的值賦給內存單元21000H位置
 9 
10 ; 其他方式
11 mov ax,ds:[0]    ; 將內存單元20000H位置的值賦給ax

Loop指令(循環)

指令的格式是:loop 標號,CPU 執行loop指令的時候,要進行兩步操作:
① (cx)=(cx)-1;
② 判斷cx中的值,不為零則轉至標號處執行程序,如果為零則向下執行。

通常我們用loop指令來實現循環功能,cx 中存放循環次數。

示例:使用程序來計算211

 1 assume cs:code
 2 code segment
 3 start:mov ax,2
 4       mov cx,11      ; 設定循環次數為11
 5       s:  add ax,ax        ; 每次循環執行的操作,每次執行的時候使cx-1
 6       loop s        ;
驗證cx的值是否為0,為0執行下面的程序,否則跳回s(s可以為任意字符串)執行 7 mov ax,4c00h ; 程序返回 8 int 21h 9 code ends ; 代碼段結束 10 end start

示例2:用加法計算123 x236 ,結果存在ax 中。

 1 assume cs:xinge        ; 定位代碼段,
 2     xinge segment    ; 代碼段可以為任意名字
 3 start:mov ax,0
 4       mov cx,123
 5       jiaxin:
 6         add ax,236
; 要循環的操作 7 loop jiaxin 8 mov ax,4c00h 9 int 21h 10 code ends 11 end xinge

loop和[bx]的聯合應用

思考:計算ffff:0~ffff:b單元中的數據的和,結果存儲在dx中。

先看一個錯的:錯誤原因,只定義了dl++,溢出不進位

 1 assume cs:code
 2 code segment
 3 start:    mov ax,0ffffH    ; 編譯器不支持字母開頭的
 4     mov ds,ax
 5     mov bx,0
 6     mov dl,0
 7     mov dh,0
 8     mov cx,12
 9     
10     s:add dl,[bx]
11       inc bx
12       loop s
13       
14       mov ax,4c00H
15       int 21
16 code ends
17 end start

正確的

 1 assume cs:code
 2 code segment
 3 start:    mov ax,0ffffH    ; 編譯器不支持字母開頭的
 4     mov ds,ax
 5     mov bx,0
 6     mov dx,0
 7     mov cx,12
 8     
 9     s:mov al,[bx]    ; 為低位賦值
10       mov ah,0    
11       add dx,ax        ; 用16位的相加,這樣不會溢出
12       inc bx
13       loop s
14       
15       mov ax,4c00H
16       int 21
17 code ends
18 end start

段前綴

出現在訪問內存單元的指令中,用於顯式地指明內存單元的段地址的“ds:”、“cs:”、“ss:”或“es:”,在匯編語言中稱為段前綴。

段前綴的使用:

示例:將內存ffff:0~ffff:b段元中的數據拷貝到 0:200~0:20b單元中。

方法一:不斷地修改ds的值,然後賦值

技術分享圖片

方法二:使用段前綴es:(es是多余段寄存器),這樣可以省去不斷地換ds的值

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片
 1 assume cs:code
 2 code segment
 3     mov cx,40H    ; 循環次數,3F+1
 4     mov ax,0
 5     mov ds,ax
 6     mov bx,200H
 7     mov dx,0
 8     s:
 9     mov [bx],dx
10     inc dx
11     loop s  
12     
13     mov ax,4c00H
14     int 21H
15 code ends
16 end
第一題答案 技術分享圖片
 1 assume cs:code
 2 code segment
 3     mov cx,40H    
 4     mov ax,20    ; 另段地址改為20
 5     mov ds,ax
 6     mov bx,0    ; bx就可以從0開始,和要推進內存單元的值一樣了
 7     s:
 8     mov ds:[bx],bx    
 9     inc bx
10     loop s  
11     
12     mov ax,4c00H
13     int 21H
14 code ends
15 end
第二題答案

匯編語言——[bx]和loop指令