匯編語言——[bx]和loop指令
阿新 • • 發佈:2017-12-22
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指令