终于可以看懂很简单很简单的汇编语言代码了,很有成就感^^
下面是一冒泡排序的汇编语言代码。
先对代码简要说明一下:
像“NEXT0:”,以字符串加冒号构成的是一个标签,翻译成汇编指令时会用偏移地址替代。
原数据放在SOURCE代表的内存单元中,排序后的数据放在RESULT代表的内容单元中。
在冒泡算法中,有两层循环,其中,寄存器BX控制外层循环,CX控制内层循环。
N EQU 4
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DW 7003h,7002h,7008h,7001h
RESULT DW N DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STAC
START PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
LEA SI,SOURCE
LEA DI,RESULT
MOV CX,N
NEXT0: MOV AX,[SI]
MOV [DI],AX
ADD SI,2
ADD DI,2
LOOP NEXT0
CLD
MOV BX,N-1
MAL1: LEA SI,RESULT
MOV CX,BX
NEXT: LODSW
CMP [SI],AX
JAE CONT
XCHG [SI],AX
MOV [SI-2],AX
CONT: LOOP NEXT
DEC BX
JNZ MAL1
RET
START ENDP
CODE ENDS
END START
STAC SEGMENT STACK
DB 128 DUP (?)
STAC ENDS
DATA SEGMENT
SOURCE DW 7003h,7002h,7008h,7001h
RESULT DW N DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STAC
START PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
LEA SI,SOURCE
LEA DI,RESULT
MOV CX,N
NEXT0: MOV AX,[SI]
MOV [DI],AX
ADD SI,2
ADD DI,2
LOOP NEXT0
CLD
MOV BX,N-1
MAL1: LEA SI,RESULT
MOV CX,BX
NEXT: LODSW
CMP [SI],AX
JAE CONT
XCHG [SI],AX
MOV [SI-2],AX
CONT: LOOP NEXT
DEC BX
JNZ MAL1
RET
START ENDP
CODE ENDS
END START
这段代码经过link后生成的汇编指令如下:
14C1:
0000
1E PUSH DS
14C1: 0001 33C0 XOR AX,AX
14C1: 0003 50 PUSH AX
14C1: 0004 B8C014 MOV AX,14C0
14C1: 0007 8ED8 MOV DS,AX
14C1: 0009 8D360000 LEA SI,[ 0000 ]
14C1:000D 8D3E0800 LEA DI,[ 0008 ]
14C1: 0011 B90400 MOV CX, 0004
14C1: 0014 8B04 MOV AX,[SI]
14C1: 0016 8905 MOV [DI],AX
14C1: 0018 83C602 ADD SI, + 02
14C1:001B 83C702 ADD DI, + 02
14C1:001E E2F4 LOOP 0014
14C1: 0020 FC CLD
14C1: 0021 BB0300 MOV BX, 0003
14C1: 0024 8D360800 LEA SI,[ 0008 ]
14C1: 0028 8BCB MOV CX,BX
14C1:002A AD LODSW
14C1:002B 3904 CMP [SI],AX
14C1:002D 7305 JNB 0034
14C1:002F 8704 XCHG AX,[SI]
14C1: 0031 8944FE MOV [SI - 02 ],AX
14C1: 0034 E2F4 LOOP 002A
14C1: 0036 4B DEC BX
14C1: 0037 75EB JNZ 0024
14C1: 0039 CB RETF
14C1:003A 0000 ADD [BX + SI],AL
14C1:003C 0000 ADD [BX + SI],AL
14C1:003E 0000 ADD [BX + SI],AL
14C1: 0001 33C0 XOR AX,AX
14C1: 0003 50 PUSH AX
14C1: 0004 B8C014 MOV AX,14C0
14C1: 0007 8ED8 MOV DS,AX
14C1: 0009 8D360000 LEA SI,[ 0000 ]
14C1:000D 8D3E0800 LEA DI,[ 0008 ]
14C1: 0011 B90400 MOV CX, 0004
14C1: 0014 8B04 MOV AX,[SI]
14C1: 0016 8905 MOV [DI],AX
14C1: 0018 83C602 ADD SI, + 02
14C1:001B 83C702 ADD DI, + 02
14C1:001E E2F4 LOOP 0014
14C1: 0020 FC CLD
14C1: 0021 BB0300 MOV BX, 0003
14C1: 0024 8D360800 LEA SI,[ 0008 ]
14C1: 0028 8BCB MOV CX,BX
14C1:002A AD LODSW
14C1:002B 3904 CMP [SI],AX
14C1:002D 7305 JNB 0034
14C1:002F 8704 XCHG AX,[SI]
14C1: 0031 8944FE MOV [SI - 02 ],AX
14C1: 0034 E2F4 LOOP 002A
14C1: 0036 4B DEC BX
14C1: 0037 75EB JNZ 0024
14C1: 0039 CB RETF
14C1:003A 0000 ADD [BX + SI],AL
14C1:003C 0000 ADD [BX + SI],AL
14C1:003E 0000 ADD [BX + SI],AL