第 3 章 汇编语言程序设计
description
第 3 章 汇编语言程序设计. 3.1 概述 指令: 计算机完成某种操作的命令 程序: 完成某种功能的指令序列 软件: 各种程序总称 机器代码,汇编语言程序,汇编程序 汇编语言程序建立步骤: (1)用编辑程序建立 .ASM 源文件 (2)用 LINK 程序把 .ASM 文件转换为 OBJ 文件 (3)用 LINK 程序把 .OBJ 文件转换为 .EXE 文件,或用 EXE 2 BIN 程序把 .EXE 文件转换为 .COM 文件 (4)在 DOS 下直接键入 .EXE 文件或 .COM 文件的文件名就可运行该程序. 3.2 语句格式. - PowerPoint PPT Presentation
Transcript of 第 3 章 汇编语言程序设计
PowerPoint 1
END [label]
.STARUP DSSSSPEND
.EXIT 0
PUBLIC:.public
STACK:SARCKLINKSSSPSARCKSSSP
COMMON:COMMONCOMMON
PRIVATE:
.USE32: 32≤4GB1632
ASSUME NOTHING
DS
DATA1 SEGMENT ‘DATA’
$JNE $6 JNE6
$$$
1
DATA1
200H
12H
201H
08H
202H
34H
203H
()
DATA2
204H
9AH
205H
78H
206H
()
207H
()
DATA3
208H
78H
209H
56H
20AH
34H
20BH
12H
DATA4
20CH
0CH
20DH
02H
20EH
99H
20FH
66H
4
DATA1
300H
12H
301H
34H
302H
56H
303H
12H
304H
34H
305H
56H
5
DATA1
100H
12H
101H
34H
102H
56H
103H
9AH
104H
9AH
105H
9AH
106H
78H
107H
56H
108H
9AH
109H
9AH
10AH
9AH
10BH
78H
BYTEWORDDWORDFWORDQWORDTWORD
FARNEAR
EXTRNPUBLIC
MOV BX,178D
2
EQU
1
2
4ANDORNOTXOR
4
6EQNELTGTLEGT
0FFFFH0
5SEGOFFSETTYPELENGTHSIZE
SEG
DB1DW2DD4DF6DQ8DT100NEAR1FAR—2
<2>DUPTYPE1DUPDUPDUPDUP1
SIZE
DATA ENDS
CODE SEGMENT
MOV DS, AX
MOV BX, OFFSET AA1 ; BX=3000H
MOV CL, TYPE AA1 ; CL=2
MOV CH, TYPE CC1 ; CH=1
MOV AL, TYPE GG1 ; AL=4
MOV AX, SIZE AA1 ; AX=200×
MOV DX, LENGTH BB1
…
PTR
BYTEWORDDWORDFWORDQWORDTWORDNEARFAR
3
4
SEGOFFSETTYPELENGTHSIZE
5
3.
1.
2. “Y”“N”
3.
data ends
db 100 dup(?)
start proc far
mul si ;B×D
mov [bx+0ah], dx
mul si ;A×D
add ax,[bx+0ah]
mul di ;B×C
adc dx,[bx+0ch]
mul di ;A×C
adc dx,0
32
data segment
sign db ?
db 100 dup(?)
mov dx, [bx+2] ;A->DX
mov si, [bx+4] ;D->SI
mov si, [bx+6] ;C->DI
cmp dx, 0 ;
jns gomul ; GOMUL
adc word ptr [bx+0eh],0 ;
done: ret
start endp
-1 x<0
xy
x“”“”xy=0;y= -1;y= 1
AL 00000001 R1
AL 00000010 R2
AL 00000100 R3
AL 00001000 R4
AL 00010000 R5
AL 00100000 R6
AL 01000000 R7
AL 10000000 R8
DB 100 DUP(?)
TOP EQU $-STACK
STARK ENDP
CODE ENDS
END BEGIN
COUNT EQU $-BUFFER
TOP EQU $-STACK
,N=90000,
90000/300=300
db 100 dup(?)
cwd
ret
2.X>0, 1/2<=a<1 -128<=b<=+127
3.X<0, -1<=a<-1/2 -128<=b<=+127
X
32
db 100 dup(?)
start proc far
begin push ds
mov ax, 0
cmp dx, 0
and dx, dx
jns again
ret
457BUFFERBLOCK
FUN1,FUN2
buffer dw 05, 05,05, 05, 05,05, 05, 05,05, 05, 05,05
block dw 12 dup (?)
db 100 dup (?)
start proc far
begin push ds
12571034689111201CC0011010110110000
name loop_use_logic_rula
data segment
buffer dw 11, 22, 33, 44, 55, 66, 77, 88, 99, 1234, 5678, 9876
block dw 12 dup (?)
db 100 dup (?)
start proc far
begin: push ds
mov ax, 0
2.I/O
3.I/OASCII7ASCII37H07H99ASCII39H
4.ASCIIASCII
5.ASCII
6.
08H 7BH DEL
7.ASCII7
db 100 dup (?)
again scasb ;
data segment
db 100 dup (?)
start proc far
begin push ds
again scasb ;
db 100 dup (?)
start proc far
begin: push ds
mov ax, 0
db 100 dup (?)
start proc far
begin: push ds
lea di,sting2
push cx
4: ASCIISTRING“1”“0”“1”
db 100 dup(?)
1CPU
data ends
db 100 dup (?)
add_0 add al,’0’
db 100 dup(?)
db 100 dup(?)
5: 16ASCII
db 100 dup(?)
start proc far
begin: push ds
js next1
db 100 dup(?)
jnc next NEXT
next: inc di
db 100 dup(?)
start proc far
begin: push ds
inc buffer
;
6
name find_nin_max_val
data segment
buffer db 10,22,12,80,6709127100040
minval db
maxval db ?
data ends
db 100 dup(?)
start proc far
begin: push ds
cmp al,minval
je next NEXT
2. ——Bubble Sort
N102212806709127100040
NeNN-1eN-1eN>eN-1eN-1eN-2e2e1…….
NN-1
00100
db 100 dup(?)
emp ax,buffer[si-2] ;eNeN-1
jge next ; eN>= eN-1,NEXT
next: dec si
dec si ;
ret
db 100 dup(?)
db 100 dup(?)
done: ret
start endp
code ends
end begin
eN/2N/2XX>eN/2eN/2N/2Ne3N/4XX< eN/20N/2eN/4X0
001115213457607890127N100N19X78
18
L0R10NJN/2J+R/2010/2=5,eN/2eJ57X78X>eJL=J=5R=10J510/27.5J7eJ78X
1
1 2
K 1 2 K 1 2 3 4
L 0 5 L 0 0 2 2
R 10 10 R 10 5 5 3
J 5 7 J 5 2 3 2
ej 57 78 ej 57 15 21 15
X>ej X=ej X< ej X> ej X< ej X≠ej
db 100 dup(?)
cmp ax,[bx] ;eJ
je found ;FOUND
popf
ret
db 100 dup(?)
cmp ax,[bx] ;XeJ
Pushf
Poopf
popf
1 2 3
6020
6000
6004
6020
6060
6060
60A0
60A0
0000
60A0
0000
6060
60A0
6020
6004
6000
6020
6060
db 100 dup(?)
db 100 dup(?)
mov [di],al
mov [di],al
mov [di],al
: 0123454
db 100 dup(?)
ret
db 100 dup(?)
Parameter Passing
MOV CX,[BX]
name use_suber_examl
data segment
db 100 dup(?)
Addz: add a1,’0’
db 100dup(?)
stack ends
code segment
assume cs:code,ss:stack
num2 dd 1h,12345h ;Y1,Y2
push bx
pop bx
mov cx,4
adc ax,cs:[bx+8] ;
mov cs:[bx+10h],ax ;
inc bx
inc bx
loop again
pop cx
pop ax
data segment
db 100dup(?)
stack ends
code segment
assume cs:code,ss:stack,ds:data,es:data
num2 dw offset va12,seg va12
result dw offset buffer,seg buffer
ret
;CS:[BX]32SIDS
;
xchg dx,bx
mov cx,4
add bx,0ch ;
pop di
pop si
pop bx
pop cx
pop ax
CS:[BX]3216
CALL
n!=
… AX-1→AX(3-1=2) AX-1→AX(2-1=1) AX-1→AX(1-1=0)
AX=NUM=3 ≠0 ≠0
CALL FACTOR CALL FACTOR CALL FACTOR
X1 X2 X3 POP AX(1→AX)
POP CX (3 →CX) POP CX(2 →CX) RET
MUL CX MUL CX
RET RET
AH,INT 21H
DOSI/O
0909BL0DAAAND 0FH
DOS2CRTASCIIDL
MOV DL ,OUTPUT_CHAR
db 100 dup(?)
mov ah,2
2
db 100dup(?)
stack ends
data segment
‘’‘’‘’111160016001240
Y
N
Y
Y
N
0
=24
DAA
1
0
=60
0
1
DAA
=60
DAA
db 100 dup(?)
BCDCX100002710H010064H100AH;
ASCII‘$’.9
BCD
ASCIIBCD
db ? ;
db 100dup(?)
stack ends
code segment
assume cs:code,ds:data,es:data,ss;stack
pop bx
dec b1
400H
MOV AH,0
INT 21H
JUMP0
³ËÊýÈ¡²¹
0
³Ë»ý±ê־ȡ·´
³ËÊý
³ËÊýÈ¡²¹
Ð޸ĵØÖ·Ö¸Õë
Ñ»·´ÎÊý¼õ
0
£¬ÉèµÚ
Ñ»·´ÎÊý¼õ
Âß¼³ß×óÒÆһλ
È¡Âß¼³ß
»·´ÎÊý£¬ÉèµØÖ·Ö¸Õë
Íê³É·ñ£¿
´æÒÆλ´ÎÊý
0
Éè´®
2
±£´æ¸ß
ת»»×Ó³ÌÐò
ÉèÑ»·´ÎÊý
´æÖÁ´æ´¢Æ÷
·µ»Ø
Íê³É·ñ£¿
ÉèÑ»·´ÎÊý¼ÆÊýÆ÷£¬
ÖÃÊýÂë¼ÆÊýÆ÷Ϊ
A
·µ»Ø
ÒÔҪɾ³ýµÄÔªËصĵØַΪĿµÄµØÖ·£¬ËüµÄÏÂÒ»¸öÔªËصÄ
µØַΪԴµØÖ·£¬ÒÔʣϵÄÔªËØÊýΪ´«ËÍÊý½øÐÐÊý¾Ý´«ËÍ
·µ»Ø
´®È«ËÑË÷
Íê·ñ£¿
1
≠
0
N
1
ÓëÁеĵÚÒ»¸öÔªËرȽÏ
KEY<X1?
KEY>N?
ÏàµÈ£¿
1
BX
Ö¸ÏòÔªËØ
ÔªËØ
3
µÄ
×îºóÔªËØ
6020
6000
6004
6060
6020
60A0
6060
0000
60A0
6060
6020
6000
6004
6020
60A0
6060
0000
60A0
È뻺³åÇø
½Ç
°Ñ·ûºÅ×÷Ϊ×î¸ßÓÐЧλ
·µ»Ø
¡Á
4
Ö¸ÁתÖÁÏàÓ¦µÄ
×Ó³ÌÐòµÄÈë¿Ú
·µ»Ø
LL FACTOR
¡ú
AX)
RET RET
ʹ
BL=0
ÑÓʱ
°Ñ
BL
Çø
°Ñ
BL
Çø
¶þ½øÖÆÊýÈ¡²¹
ÖÆ
°ÑÊäÈëÊýµÄ
ASCII
¡®£º¡¯£¬ÒªÇóÊäÈëÊ®½øÖÆÊý
0
1
Y
N
Y
N
ÀûÓù¦Äܵ÷ÓÃ
°ÑÊäÈë
µÄ
ASCII
ÃëÔöÁ¿
DAA
ÀûÓù¦Äܵ÷ÓÃ
ÖÁ
CH
BL
ÔöÁ¿
DAA
END [label]
.STARUP DSSSSPEND
.EXIT 0
PUBLIC:.public
STACK:SARCKLINKSSSPSARCKSSSP
COMMON:COMMONCOMMON
PRIVATE:
.USE32: 32≤4GB1632
ASSUME NOTHING
DS
DATA1 SEGMENT ‘DATA’
$JNE $6 JNE6
$$$
1
DATA1
200H
12H
201H
08H
202H
34H
203H
()
DATA2
204H
9AH
205H
78H
206H
()
207H
()
DATA3
208H
78H
209H
56H
20AH
34H
20BH
12H
DATA4
20CH
0CH
20DH
02H
20EH
99H
20FH
66H
4
DATA1
300H
12H
301H
34H
302H
56H
303H
12H
304H
34H
305H
56H
5
DATA1
100H
12H
101H
34H
102H
56H
103H
9AH
104H
9AH
105H
9AH
106H
78H
107H
56H
108H
9AH
109H
9AH
10AH
9AH
10BH
78H
BYTEWORDDWORDFWORDQWORDTWORD
FARNEAR
EXTRNPUBLIC
MOV BX,178D
2
EQU
1
2
4ANDORNOTXOR
4
6EQNELTGTLEGT
0FFFFH0
5SEGOFFSETTYPELENGTHSIZE
SEG
DB1DW2DD4DF6DQ8DT100NEAR1FAR—2
<2>DUPTYPE1DUPDUPDUPDUP1
SIZE
DATA ENDS
CODE SEGMENT
MOV DS, AX
MOV BX, OFFSET AA1 ; BX=3000H
MOV CL, TYPE AA1 ; CL=2
MOV CH, TYPE CC1 ; CH=1
MOV AL, TYPE GG1 ; AL=4
MOV AX, SIZE AA1 ; AX=200×
MOV DX, LENGTH BB1
…
PTR
BYTEWORDDWORDFWORDQWORDTWORDNEARFAR
3
4
SEGOFFSETTYPELENGTHSIZE
5
3.
1.
2. “Y”“N”
3.
data ends
db 100 dup(?)
start proc far
mul si ;B×D
mov [bx+0ah], dx
mul si ;A×D
add ax,[bx+0ah]
mul di ;B×C
adc dx,[bx+0ch]
mul di ;A×C
adc dx,0
32
data segment
sign db ?
db 100 dup(?)
mov dx, [bx+2] ;A->DX
mov si, [bx+4] ;D->SI
mov si, [bx+6] ;C->DI
cmp dx, 0 ;
jns gomul ; GOMUL
adc word ptr [bx+0eh],0 ;
done: ret
start endp
-1 x<0
xy
x“”“”xy=0;y= -1;y= 1
AL 00000001 R1
AL 00000010 R2
AL 00000100 R3
AL 00001000 R4
AL 00010000 R5
AL 00100000 R6
AL 01000000 R7
AL 10000000 R8
DB 100 DUP(?)
TOP EQU $-STACK
STARK ENDP
CODE ENDS
END BEGIN
COUNT EQU $-BUFFER
TOP EQU $-STACK
,N=90000,
90000/300=300
db 100 dup(?)
cwd
ret
2.X>0, 1/2<=a<1 -128<=b<=+127
3.X<0, -1<=a<-1/2 -128<=b<=+127
X
32
db 100 dup(?)
start proc far
begin push ds
mov ax, 0
cmp dx, 0
and dx, dx
jns again
ret
457BUFFERBLOCK
FUN1,FUN2
buffer dw 05, 05,05, 05, 05,05, 05, 05,05, 05, 05,05
block dw 12 dup (?)
db 100 dup (?)
start proc far
begin push ds
12571034689111201CC0011010110110000
name loop_use_logic_rula
data segment
buffer dw 11, 22, 33, 44, 55, 66, 77, 88, 99, 1234, 5678, 9876
block dw 12 dup (?)
db 100 dup (?)
start proc far
begin: push ds
mov ax, 0
2.I/O
3.I/OASCII7ASCII37H07H99ASCII39H
4.ASCIIASCII
5.ASCII
6.
08H 7BH DEL
7.ASCII7
db 100 dup (?)
again scasb ;
data segment
db 100 dup (?)
start proc far
begin push ds
again scasb ;
db 100 dup (?)
start proc far
begin: push ds
mov ax, 0
db 100 dup (?)
start proc far
begin: push ds
lea di,sting2
push cx
4: ASCIISTRING“1”“0”“1”
db 100 dup(?)
1CPU
data ends
db 100 dup (?)
add_0 add al,’0’
db 100 dup(?)
db 100 dup(?)
5: 16ASCII
db 100 dup(?)
start proc far
begin: push ds
js next1
db 100 dup(?)
jnc next NEXT
next: inc di
db 100 dup(?)
start proc far
begin: push ds
inc buffer
;
6
name find_nin_max_val
data segment
buffer db 10,22,12,80,6709127100040
minval db
maxval db ?
data ends
db 100 dup(?)
start proc far
begin: push ds
cmp al,minval
je next NEXT
2. ——Bubble Sort
N102212806709127100040
NeNN-1eN-1eN>eN-1eN-1eN-2e2e1…….
NN-1
00100
db 100 dup(?)
emp ax,buffer[si-2] ;eNeN-1
jge next ; eN>= eN-1,NEXT
next: dec si
dec si ;
ret
db 100 dup(?)
db 100 dup(?)
done: ret
start endp
code ends
end begin
eN/2N/2XX>eN/2eN/2N/2Ne3N/4XX< eN/20N/2eN/4X0
001115213457607890127N100N19X78
18
L0R10NJN/2J+R/2010/2=5,eN/2eJ57X78X>eJL=J=5R=10J510/27.5J7eJ78X
1
1 2
K 1 2 K 1 2 3 4
L 0 5 L 0 0 2 2
R 10 10 R 10 5 5 3
J 5 7 J 5 2 3 2
ej 57 78 ej 57 15 21 15
X>ej X=ej X< ej X> ej X< ej X≠ej
db 100 dup(?)
cmp ax,[bx] ;eJ
je found ;FOUND
popf
ret
db 100 dup(?)
cmp ax,[bx] ;XeJ
Pushf
Poopf
popf
1 2 3
6020
6000
6004
6020
6060
6060
60A0
60A0
0000
60A0
0000
6060
60A0
6020
6004
6000
6020
6060
db 100 dup(?)
db 100 dup(?)
mov [di],al
mov [di],al
mov [di],al
: 0123454
db 100 dup(?)
ret
db 100 dup(?)
Parameter Passing
MOV CX,[BX]
name use_suber_examl
data segment
db 100 dup(?)
Addz: add a1,’0’
db 100dup(?)
stack ends
code segment
assume cs:code,ss:stack
num2 dd 1h,12345h ;Y1,Y2
push bx
pop bx
mov cx,4
adc ax,cs:[bx+8] ;
mov cs:[bx+10h],ax ;
inc bx
inc bx
loop again
pop cx
pop ax
data segment
db 100dup(?)
stack ends
code segment
assume cs:code,ss:stack,ds:data,es:data
num2 dw offset va12,seg va12
result dw offset buffer,seg buffer
ret
;CS:[BX]32SIDS
;
xchg dx,bx
mov cx,4
add bx,0ch ;
pop di
pop si
pop bx
pop cx
pop ax
CS:[BX]3216
CALL
n!=
… AX-1→AX(3-1=2) AX-1→AX(2-1=1) AX-1→AX(1-1=0)
AX=NUM=3 ≠0 ≠0
CALL FACTOR CALL FACTOR CALL FACTOR
X1 X2 X3 POP AX(1→AX)
POP CX (3 →CX) POP CX(2 →CX) RET
MUL CX MUL CX
RET RET
AH,INT 21H
DOSI/O
0909BL0DAAAND 0FH
DOS2CRTASCIIDL
MOV DL ,OUTPUT_CHAR
db 100 dup(?)
mov ah,2
2
db 100dup(?)
stack ends
data segment
‘’‘’‘’111160016001240
Y
N
Y
Y
N
0
=24
DAA
1
0
=60
0
1
DAA
=60
DAA
db 100 dup(?)
BCDCX100002710H010064H100AH;
ASCII‘$’.9
BCD
ASCIIBCD
db ? ;
db 100dup(?)
stack ends
code segment
assume cs:code,ds:data,es:data,ss;stack
pop bx
dec b1
400H
MOV AH,0
INT 21H
JUMP0
³ËÊýÈ¡²¹
0
³Ë»ý±ê־ȡ·´
³ËÊý
³ËÊýÈ¡²¹
Ð޸ĵØÖ·Ö¸Õë
Ñ»·´ÎÊý¼õ
0
£¬ÉèµÚ
Ñ»·´ÎÊý¼õ
Âß¼³ß×óÒÆһλ
È¡Âß¼³ß
»·´ÎÊý£¬ÉèµØÖ·Ö¸Õë
Íê³É·ñ£¿
´æÒÆλ´ÎÊý
0
Éè´®
2
±£´æ¸ß
ת»»×Ó³ÌÐò
ÉèÑ»·´ÎÊý
´æÖÁ´æ´¢Æ÷
·µ»Ø
Íê³É·ñ£¿
ÉèÑ»·´ÎÊý¼ÆÊýÆ÷£¬
ÖÃÊýÂë¼ÆÊýÆ÷Ϊ
A
·µ»Ø
ÒÔҪɾ³ýµÄÔªËصĵØַΪĿµÄµØÖ·£¬ËüµÄÏÂÒ»¸öÔªËصÄ
µØַΪԴµØÖ·£¬ÒÔʣϵÄÔªËØÊýΪ´«ËÍÊý½øÐÐÊý¾Ý´«ËÍ
·µ»Ø
´®È«ËÑË÷
Íê·ñ£¿
1
≠
0
N
1
ÓëÁеĵÚÒ»¸öÔªËرȽÏ
KEY<X1?
KEY>N?
ÏàµÈ£¿
1
BX
Ö¸ÏòÔªËØ
ÔªËØ
3
µÄ
×îºóÔªËØ
6020
6000
6004
6060
6020
60A0
6060
0000
60A0
6060
6020
6000
6004
6020
60A0
6060
0000
60A0
È뻺³åÇø
½Ç
°Ñ·ûºÅ×÷Ϊ×î¸ßÓÐЧλ
·µ»Ø
¡Á
4
Ö¸ÁתÖÁÏàÓ¦µÄ
×Ó³ÌÐòµÄÈë¿Ú
·µ»Ø
LL FACTOR
¡ú
AX)
RET RET
ʹ
BL=0
ÑÓʱ
°Ñ
BL
Çø
°Ñ
BL
Çø
¶þ½øÖÆÊýÈ¡²¹
ÖÆ
°ÑÊäÈëÊýµÄ
ASCII
¡®£º¡¯£¬ÒªÇóÊäÈëÊ®½øÖÆÊý
0
1
Y
N
Y
N
ÀûÓù¦Äܵ÷ÓÃ
°ÑÊäÈë
µÄ
ASCII
ÃëÔöÁ¿
DAA
ÀûÓù¦Äܵ÷ÓÃ
ÖÁ
CH
BL
ÔöÁ¿
DAA