A. 匯編中LOOP的用法全解
loop通常用作循環處理,語法格式:loop標識。
cou執行loop指令需要兩步:
1、(cx)=(cs)-1;
2、cx不為0的時候轉到標號出執行,把IP改為標號的偏移地址,為0的時候執行loop下一條指令;
cx一般放循環次數;
格式框架如下:
movcx,循環次數
標號:循環執行的代碼
loop標號
(1)匯編程序循環語句擴展閱讀
匯編中LOOP的使用
例:
assumecs:code
codesegment
movax,10
movcx,3
A:addax,ax
loopA
movax,4c00h
int21h
codeends
end
addax,ax位置在IP=0006的地址上,執行loopA時看到換成loop0006說明標識「A」編譯成addax,ax的地址,這時候要執行我前面說的loop執行的兩個步驟,
(cx)=(cx)-1=3-1=2cx為2不為0轉到ip=0006執行循環
如果有很多次循環,如1000次,這樣單步運行就很煩,這時候可以用g+偏移地址命令直接運行到你想要的指令處或者運行到loop處用p命令直接運行到循環的下一條指令處
B. 匯編語言循環實驗,利用循環語句實現以下題目,求匯編代碼
;(1) 片內從30H起始的連續10個單元內容送21H,22H,23H....2AH,
; 求和後送40H,
ORG 0000H
MOV R0,#30H
MOV R7,#10
MOV A,#21H
LOOP:
MOV @R0,A
DJNZ R7,LOOP
MOV R0,#30H
MOV R7,#10
MOV A,#00H
LOOP:
ADD A,@R0
DJNZ R7,LOOP
MOV 40H,A
SJMP $
;############################
;(3) 如果看成字來進行5個字的數據加法求和,結果放在40H和41H裡面低位低位元組,
;高位高位元組求和。
ORG 0000H
MOV R0,#30H
MOV R1,#31H
MOV 40H,#00H
MOV 41H,#00H
MOV R7,#5
LOOP:
MOV A,40H
ADD A,@R0
MOV 40H,A
MOV A,41H
ADDC A,@R1
MOV 41H,A
INC R0
INC R0
INC R1
INC R1
DJNZ R7,LOOP
SJMP $
C. 匯編語言中loop指令的含義
功能有二:第一個是在在循環使用時:mov cx,n ;s:。。。。;loop s 使得cx減一,然後繼續循環,注意是先減一,若減一後cx為零了,那麼就不執行循環了,跳過loop s向下執行。
第二個功能是沒有循環,也沒有前面的mov cx,n,這時就是判定執行到Loop s前的cx值,若cx為零則忽略Loop s,若cx不為零則繼續執行下面的步驟。
總的來說兩個功能是一樣的,但還是分開理解吧,參悟透了就豁然開朗了
D. 請問匯編中指令MOV CX,0 LOP:LOOP LOP語句循環了多少次,請詳細解釋一下,謝謝
第一次循環的話指令loop語句的時候 cx-1=0-1=FFFF,這時候CF(狀態字中的 進位借位)的值為1。也就是說執行第一次後CX的值為FFFF,然後再次執行LOOP的時候CX繼續減1,知道CX再次為0的時候一共執行了FFFFH次,換算成十進制是65536次,這就是你這個程序執行循環的最多次數了
E. 怎麼用匯編語言實現for循環
匯編語言實現for循環十分容易,比如51匯編,用DJNZ指令就可以了,舉例如下:
C語言:
for(i=0;i<10;i++)a=a+i;
匯編語言:
i equ 30h
m equ 31h
......
mov i,#0
mov m,#0
mov r2,#10
loop:
mov a,i
add a,m
mov m,a
djnz r2,loop
F. 匯編語言循環指令
JC轉移的條件是當CF=1
即當排在它前面的那一個四則運算是否有進位或借位
使得CF置1時即轉移
它是否要進行轉移與CX寄存器是無關
如果你想用循環的次數來控制循環的話
那可以用Jcxz指令
把要循環的次數賦給CX的寄存器
然後再用Jcxz語句去判斷
當CX的數減至0的時候將會發生跳轉
G. 匯編語言,用循環語句編寫1到1000的累加和程序
mov cx,1000
mov dx,0
mov ax,0
mov bx,1
next:
add ax,bx
adc dx,0
inc bx
loop next
結果存 DX:AX 中,DX為高16位,AX為低16位,共32位。
以下為DEBUG 調試結果:
C:\>DEBUG
-a
0AF9:0100 mov cx,3e8
0AF9:0103 mov dx,0
0AF9:0106 mov ax,0
0AF9:0109 mov bx,1
0AF9:010C add ax,bx
0AF9:010E adc dx,0
0AF9:0111 inc bx
0AF9:0112 loop 10c
0AF9:0114 int 20
0AF9:0116
-g114
AX=A314 BX=03E9 CX=0000 DX=0007 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF9 ES=0AF9 SS=0AF9 CS=0AF9 IP=0114 NV UP EI PL NZ NA PO NC
0AF9:0114 CD20 INT 20
-
結果=7A314(H)=500500(D)
H. 用匯編 寫一段完整的源程序,定義一個存儲100個字的數組A,並用循環語句將其中的每個元素減1。 求速度解
DATAS SEGMENT
NUM DB 100 DUP(5)
;此處輸入數據段代碼
DATAS ENDS
STACKS SEGMENT
;此處輸入堆棧段代碼
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV CX,100
LEA BX,NUM
LOD:DEC BYTE PTR[BX]
ADD BX,1
LOOP LOD
;此處輸入代碼段代碼
MOV AH,4CH
INT 21H
CODES ENDS
END START
I. 關於匯編語言中的LOOP指令
這個程序循環一次,是由CX存放的。
cx中存放的是循環的次數
編程計算2^12:
assume cs:code
code segment
mov ax,2
mov cx,11
s:add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end
執行loop s時,首先要將(cx)減1,若(cx)不為0,則前往s處執行add ax,ax。
CPU執行LOOP指令的時候,要進行兩步操作:
1 (cx)=(cx)-1
2 判斷cx中的值,不為零則轉移到標號處執行程序,如果為零,則向下執行
例1 計算2^2 結果放在AX
CODE SEGMENT
ASSUME CS:CODE
MOV AX,2
ADD AX,AX
MOV AX,4C00H
INT 21H
code ENDS
例2 計算2^3 結果放在AX
CODE SEGMENT
ASSUME CS:CODE
MOV AX,2
ADD AX,AX
ADD AX,AX
MOV AX,4C00H
INT 21H
code ENDS
注意:
計算ffff:0-ffff:b單元中的數據之和,結果存儲在dx中。
運算後的結果會不會查過dx所可以承受的存儲范圍。ffff:0-ffff:b是位元組型數據,范圍在0-255,12個這樣的數,即使都是255相加也不會超過65535
不可以直接將數據累加在dx中。因為ffff:0-ffff:b是位元組型數據8位,dx中存放16位數據。
不可以直接將數據累加到dl中,因為dl是8位寄存器,所容納的數據的范圍在0-255之間,ffff:0-ffff:b中的數據也都是8位,若僅向dl累加12個8位數據,可能會引起進位丟失的這種情況。
J. 匯編語言loop語句
在匯編語言中,LOOP是循環指令,固定以CX控制循環次數,簡化循環程序設計。
該指令書寫格式:LOOP
OPR(OPR是程序中的目標地址標號)
該指令執行步驟:(CX)
←(CX)
−1;若(CX)≠0,則循環到標號處執行,否則順序執行。
程序在使用LOOP指令之前應先將循環次數送入CX中。
例如:
MOV
CX,10;設置循環次數
MOV
AX,1
OPR1:
SHL
AX,1
LOOP
OPR1