汇编语言补充资料 ( 自学 )
DESCRIPTION
汇编语言补充资料 ( 自学 ). 1 、数值转换中应用 数据输入 / 输出时的转换 2 、串操作中应用 串移动、串搜索、串比较、 串插入、串删除 3 、代码转换中应用 ASCII 码 BCD 码 二进数 BCD 码 4 、算术运算. 在这一部分,我们将汇编语言在数据处理中的应用集中起来给大家,其中有些程序在 11 章中已经介绍过。. - PowerPoint PPT PresentationTRANSCRIPT
1
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
1 、数值转换中应用 数据输入 / 输出时的转换2 、串操作中应用 串移动、串搜索、串比较、 串插入、串删除3 、代码转换中应用 ASCII 码 BCD 码 二进数 BCD 码 4 、算术运算
在这一部分,我们将汇编语言在数据处理中的应用集在这一部分,我们将汇编语言在数据处理中的应用集中起来给大家,其中有些程序在中起来给大家,其中有些程序在 1111 章中已经介绍过。章中已经介绍过。
汇编语言补充资料汇编语言补充资料 (( 自学自学 ))
2
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
ASCII 码输入设备
ASCII 码表示的十进制二进制
ASCII 码表示的十六进制二进制
ASCII 码表示的二进制二进制
机内二进制操作运算
二进制 ASCII 码表示的十进制
二进制 ASCII 码表示的十六进制
二进制 ASCII 码表示的二进制
ASCII 码输出设备
3
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
ASCIIASCII 码十进制转换为二进制数码十进制转换为二进制数
设 5 位十进数从高位到低位依次是 d4 、 d3 、 d2 、 d1 、 d0 。可用下列多项式进行计算: ((((0*10+d4)*10+d3)*10+d2)*10+d1)*10+d0
初始化
是 0--9
ASCII 码 -30H
累加器 *10
累加器 + 这一位值
修改指令
结束
N
Y
汇编语言在数值转换中的应用汇编语言在数值转换中的应用
4
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
CHG_DEC_BIN PROC ; SI SI 指向十进制缓冲区首址指向十进制缓冲区首址MOV DX, 0 ;初始化MOV CX, 10
GET_ASC: MOV AL, [SI] ;取得十进制数CMP AL, ‘0’JB EXITCMP AL, ‘9’JA EXIT
DEC_BIN: SUB AL, 30HMOV AH, 0PUSH AXPUSH AXMOV AX, DXMUL CX ; *10MOV DX, AXPOP AXPOP AXADD DX, AXINC SI ;修改指针JMP GET_ASC
EXIT: RET ; 转换后的二进数在转换后的二进数在 DXDX 中中 CHG_DEC_BIN ENDP
5
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
二进制数转换为 二进制数转换为 ASCIIASCII 码十进码十进制制
6
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
BIN_TO_DEC PROC ;被转换的十进数在被转换的十进数在 AXAX 中中 PUSH DI ; DI DI 指向存放十进数缓冲区首址指向存放十进数缓冲区首址MOV CX, 5 ;初始化
CLEAR_BUF: MOV BYTE PTR[DI], ‘ ‘INC DILOOP CLEAR_BUFDEC DIMOV CX, 10
CHANGE: MOV DX, 0MOV DX, 0 ;转换;转换DIV CX DIV CX ;除以;除以 1010 ,余数在,余数在 DXDXADD DL, 30HADD DL, 30H ;; ASCIIASCII 码码MOV BYTE PTR[DI], DLMOV BYTE PTR[DI], DL ;存储十进制数;存储十进制数DEC DIDEC DICMP AX, 0 CMP AX, 0 商是否为商是否为 00 ??JNZ CHANGEJNZ CHANGEPOP DIRET
BIN_TO_DEC ENDP
7
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
ASCIIASCII 码十六进制数转换为二进制数码十六进制数转换为二进制数 十六进制数的字符为 0~9 和 A~F ,输入后, ASCII 码为 30H~39H 和 41H~46H 转换时,若是数字若是数字 0~90~9 ,减,减 30H30H 若是若是 A~FA~F ,减去,减去 37H37H HEX_TO_BIN PROC
PUSH AX PUSH CX MOV DX, 0 ;转换后结果在转换后结果在 DXDX 中中
GET_CHAR: MOV AX, 01H ;键盘输入 INT 21H SUB AL,30H JL EXIT CMP AL, 0AH JL CHANGE
SUB AL, 07H
8
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
CMP AL, 0AH ;是否是大写字母JL EXITCMP AL, 0FHJLE CHANGECMP AL, 2AH ;是否是小写字母JL EXITCMP AL, 2FHJLE CHANGEJMP EXIT
CHANGE:CHANGE: MOV CL, 4MOV CL, 4 ;转换;转换SHL DX, CLSHL DX, CLMOV AH, 0MOV AH, 0ADD DX, AXADD DX, AXJMP GET_CHARJMP GET_CHARPOP CXPOP AX
EXIT: RET HEX_TO_BIN ENDP
9
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
串移动(数据块移动)串移动(数据块移动) 串搜索串搜索 串比较串比较 串插入串插入 串删除串删除 求串长求串长
汇编语言在串操作中的应用汇编语言在串操作中的应用
10
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
数据块移动数据块移动 1 、一般情况 S1 S2
源区 目的区
2 、特殊情况:源区与目的区重叠源区与目的区重叠
源区 目的区
目的区 源区
11
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
串搜索例串搜索例 将串 STR 中第一个‘ I’ 字符找出,并显示其在串中的位移量
D_SEG SEGMENTSTR DB ‘THIS IS A COMPUTER’STR_LEN = $-STRD_SEG ENDS......
LEA DI, STRMOV CX, STR_LENMOV AL, ’I’CLD
FOUND: REPNZ SCASBREPNZ SCASBJE OK1JCXZ RETN
OK1:OK1: MOV DX, DIMOV DX, DIDEC DLDEC DL ;第一个;第一个 'I''I' 字符距串头位移量字符距串头位移量MOV BL, DLMOV BL, DL
12
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
PUSH CXMOV CL,4SHR DL, CLPOP CXCMP DL, 0AHJB OK2ADD DL, 7
OK2: ADD DL, 30HMOV AH, 02HINT 21H ;显示位移量高位MOV DL, BLAND DL, 0FHCMP DL, 0AHJB OK3
0K3: ADD DL, 30HMOV AH, 02HINT 21H ;显示位移量低位MOV DL, 'H'INT 21H
RETN: ......
13
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
串比较例 串比较例 比较串 STR1 和 STR2 是否相等 D_SEG SEGMENT
STR1 DB 'STRING1'STR2 DB 'STRING2'STR_LEN = ($-STR1)/2MSG1 DB 'NOT EQUAL','$'MSG2 DB 'EQUAL','$'
D_SEG ENDS......
LEA SI, STR1MOV DI, OFFSET STR2MOV CX, STR_LENCLD
14
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
REPE CMPSBREPE CMPSBJNZ NO_EQUA
EQUA: MOV AH, 09HLEA DX, MSG2INT 21H ;提示两个串相等JMP CMP_END
NO_EQUA: MOV AH, 09HLEA DX, MSG1INT 21H ;提示两个串不等......
CMP_END:......
15
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
串插入串插入串插入分三种情况: 1 、在目的串首插入 2 、在目的串尾插入 3 、在目的串中指定的位置插入串插入例串插入例 将正数 N 插入一个升序的字数组中, 数组的首地址和末地址为 A_HEAD 和 A_END X 3 A_HEAD X DW ? 5 A_HEAD DW 3,5,23,49,52,65 23 A_END DW 105 49 N DW 32 52 65 105 A_END 32 N
16
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
MOV AX, N MOV A_HEAD-2, -1MOV A_HEAD-2, -1 MOV SI, 0 COMPARE:CMP A_END[SI], AX ;从最后一个元素开始比较;从最后一个元素开始比较 JLE INSERT MOV BX, A_END[SI] MOV A_END[SI+2], BX ;元素后移一个位置;元素后移一个位置 SUB SI, 2 JMP COMPARE INSERT: MOV A_END[SI+2], AX ;插入;插入 .....
17
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
串删除串删除 串删除例串删除例 附加段中有一个首地址为 LIST 的字数组,数组的第一字中存放该数组长度,数组首地址在 DI 中,数 X 在 AX 中,现要在数组中查找 X ,若找到则删除。
18
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
CLD PUSH DI MOV CX, ES:[DI] ;数组长度送 CX ADD DI, 2 ; DI 指向第一个元素 REPNE SCASWREPNE SCASW ;串扫描 JE DELETE ;如找到则删除 POP DI ;否则,退出 JMP EXIT
DELET: JCXZ DEC_CNTJCXZ DEC_CNT ;若 CX=0 , X 为最后一个元素NEXT_EL: MOV BX, ES:[DI]
MOV ES:[DI-2], BX ;元素向前移动一个位置元素向前移动一个位置 ADD DI, 2 LOOP NEXT_EL
DEC_CNT: POP DI DEC WORD PTR ES:[DI] ;数组元素个数减数组元素个数减 11
EXIT: ......
19
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
求串长求串长求串长例求串长例 求字符串的长度送入 LEN ,假定串以‘ $’ 结束 STRING DB ‘Hello,How are you!’,’$’ ……. MOV SI, OFFSET STRING XOR BL, BLLOP: MOV AL, [SI] CMP AL,’$’CMP AL,’$’ JZ DONE INC BL INC SI JMP LOPDONE: MOV LEN, BL
20
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
11 、十进制、十进制 ASCII ASCII 码转换成码转换成 BCDBCD 码码
22 、、 BCDBCD 码转换成十进制数的码转换成十进制数的 ASCIIASCII 码码
33 、二进制数转换为、二进制数转换为 BCDBCD 码码
44 、、 BCDBCD 码转换为二进制数码转换为二进制数
汇编语言在代码转换中的应用汇编语言在代码转换中的应用
21
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
十进制十进制 ASCII ASCII 码转换成码转换成 BCDBCD 码例码例 令 ASC_BUF 开始的缓冲区内存放着若干个 ASCII 码表示 ASC_BUF 31H 的十进制数, ( 每个单元存放一 32H个十进制数 ) ,要求将其转换成 33HBCD 码,并把两个相邻单元的 34HBCD 码合并在一个存储单元中 35H 若 ASCII 码的个数为奇数,则将首地址单元的十进制数对 应的 BCD 码单独存放一个单元 , BCD_BUF 1其余的按统一方法处理 32 子程序名: DEC_ASC_BCD 54入口参数:入口参数: DS:SIDS:SI 指向指向 ASCIIASCII 码首地址码首地址 ASC_BUFASC_BUF ES:DIES:DI 指向指向 BCDBCD 码首地址码首地址 BCD_BUFBCD_BUF CX=CX= 串长度串长度 , DS,ES, DS,ES 指向同一个段指向同一个段 出口参数:出口参数: BCDBCD 码存放在码存放在 BCD_BUFBCD_BUF 为首地址的缓冲区内 为首地址的缓冲区内
22
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
DEC_ASC_BCD PROC FAR PUSH SI ;保护现场 PUSH DI PUSH AX PUSH BX PUSH CX ROR CX, 1ROR CX, 1 JNC NEXTJNC NEXT ; ASCII 码为偶数个转移 ROL CXROL CX LODSB LODSB ;取;取 ASCIIASCII 码到码到 ALAL AND AL, 0FH AND AL, 0FH ;; ASCIIASCII 码转换成码转换成 BCDBCD 码码 STOSB STOSB ;存储;存储 BCDBCD 码码 DEC CXDEC CX ROR CX,1 ROR CX,1 ;奇数个时单独处理完;奇数个时单独处理完
23
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
NEXT: LODSBNEXT: LODSB AND AL, 0FHAND AL, 0FH MOV BL, AL MOV BL, AL LODSBLODSB PUSH CXPUSH CX MOV CL, 4MOV CL, 4 SAL AL, CLSAL AL, CL POP CXPOP CX ADD AL, BL ADD AL, BL ;合并;合并 BCDBCD 码码 STOSB STOSB ;存储;存储 BCDBCD 码码 LOOP NEXTLOOP NEXT POP CX ;恢复现场 POP BX POP AX POP DI POP SI RET DEC_ASC_BCD ENDP
24
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
BCDBCD 码转换成十进制数的码转换成十进制数的 ASCIIASCII 码例码例 将数据段字节变量 BCD_BUF 为首地址的缓冲区中一个八位十进制数对应的压缩 BCD 码转换成 ASCII 码,并显示 BCD_BUF 12 34 56 78 显示: 7 8 5 6 3 4 1 2
子程序名: BCD_DEC_ASC 入口参数:一个八位十进制数对应的压缩入口参数:一个八位十进制数对应的压缩 BCDBCD 码存储码存储 在在 BCD_BUFBCD_BUF 缓冲区缓冲区 出口参数: 正常结束,出口参数: 正常结束, DH=0FFHDH=0FFH
25
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
BCD_DEC_ASC PROC NEAR PUSH SI ;保护现场 PUSH AX PUSH CX MOV CX, 4 LEA SI, BCD_BUF ADD SI, 3ADD SI, 3 MOV DH, 0 CHG_OUT1: PUSH CX MOV AL, [SI] MOV AL, [SI] ;取压缩;取压缩 BCDBCD 码码 DEC SI DEC SI ;修改指针;修改指针 MOV DL, ALMOV DL, AL MOV CL, 4MOV CL, 4 ROR AL, 4ROR AL, 4 AND AL, 0FH AND AL, 0FH ;取高半字节;取高半字节 BCDBCD 码码 ADD AL, 30H ADD AL, 30H ;生成;生成 ASCIIASCII 码码 CALL STD_OUT ;标准设备输出
26
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
CHG_OUT2: POP CX CMP CX, 1 JNZ CHG_OUT3 MOV DH, 0FFH CHG_OUT3: PUSH CX MOV AL, DLMOV AL, DL AND AL, 0FH AND AL, 0FH ;取低半字节;取低半字节 BCDBCD 码码 ADD AL, 30H ADD AL, 30H ;生成;生成 ASCIIASCII 码码 CALL STD_OUT ;标准设备输出 CHG_OUT4: POP CX LOOP CHG_OUT1 POP CX POP AX POP SI RET BCD_DEC_ASC ENDP
27
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
STD_OUT PROC NEAR ;标准设备输出 PUSH DX PUSH AX MOV DL, AL MOV AH, 2 INT 21H POP AX POP DX RET STD_OUT ENDP
28
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
二进制数转换为二进制数转换为 BCDBCD 码例码例 DX 寄存器中为一个十六位无符号二进制数 (0-65535), 将其转换为压缩的 BCD 码 , 保存在 BCD_BUF 缓冲区 DX BCD_BUFBIN_TO_BCD PROC FAR 15678 78 PUSH AX 56 PUSH CX 1 PUSH DX 0 PUSH DI 0 LEA DI, BCD_BUF MOV AL, 0 MOV CX, 5CLEAR_BUF: MOV [DI], AL ;初始化缓冲区 INC DI LOOP CLEAR_BUF LEA DI, BCD_BUF
29
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
CHG_BCD1: MOV AX, DX ;转换开始 MOV DX,0 MOV CX,10 DIV CX XCHG AX, DX ;交换余数和商 MOV BL, AL ;余数送 AL MOV AX, DX MOV DX, 0 MOV CX, 10 DIV CX XCHG AX, DX MOV CL, 4 ROL AL, CL AND AL, 0F0H OR AL, BL ;组合 BCD 码 MOV [DI], AL ;存储 BCD 码 INC DI CMP DX, 0 JNZ CHG_BCD1 POP DI ……
30
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
BCDBCD 码转换为二进制数例码转换为二进制数例 将 AX 寄存器中的四位压缩型 BCD 码转换为二进制数 BCD_TO_BIN PROC PUSH CX PUSH SI PUSH DI MOV SI, AX XOR AX, AX MOV CX, 4 AGAIN1: MOV DI, 0 PUSH CX MOV CX, 4 AGAIN2: SHL SI, 1 SHL SI, 1 ;左移;左移 11 位,最高位位,最高位 -->CF-->CF RCL DI, 1 RCL DI, 1 ;; CFCF 移入移入 DIDI 中中 LOOP AGAIN2 LOOP AGAIN2 ;重复;重复 44 次得到次得到 11 位位 BCDBCD 码码
31
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
MOV CX,10 MUL CX ;乘 10 ADD AX, DI POP CX LOOP AGAIN1 MOV DX, AX ;转换后的二进数在 DX 中 POP DI POP SI POP CX RET BCD_TO_BIN ENDP
32
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
多精度加法运算多精度加法运算 例如,两个无符号四字节二进数相加: 3 4 6 B 7 F 7 A H + 2A BC 8 5 4 8 H 5 F 2 8 0 4 C 2 H 计算步骤为: 第一步 第二步 7 A F 7 4 8 8 5 ADC 0 ADC 0 C 2 (CF=0) 0 4 (CF=1)
第三步 第四步 6 B 3 4 B C 2 A ADC 1 ADC 1 2 8 (CF=1) 5 F (CF=0)
算术运算算术运算
33
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
ADR1 DB 7AH, 7FH, 6BH, 34HADR2 DB 48H, 85H, 0BCH, 2AHSUM DB 0, 0, 0, 0 …… MOV SI, OFFSET ADR1 MOV BX, OFFSET ADR2 MOV DI, OFFSET SUM MOV CL, 4 CLC ; CF<--0 AGAIN: MOV AL, [SI] ADC AL, [BX] ;字节加 MOV [DI], AL INC SI ;修改地址 INC BX INC DI LOOP AGAIN
34
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
设在单元 A 、 B 和 C 存放有三个数,若三个数都不为 0 ,则求出三个数之和存入 D 中;若有一个为 0 ,则将其他两个单元也清 0 。
MOV AX, ACMP AX, 0JZ P1JZ P1MOV AX, BCMP AX, 0JZ P1JZ P1MOV AX, CCMP AX, 0JZ P1JZ P1ADD AX, A
ADC AX, B MOV D, AX JMP DONEJMP DONEP1: MOV A, 0 MOV B, 0 MOV C, 0DONE: ….
35
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
数据区 DATA1 和 DATA2 分别存放 N 个字节数据,检查它们的数据是否相同。若完全一致,则将 FLAG 置 FFH ,否则置 0 ,并将第一次出现的不同数据的地址分别存入 D1 和 D2 中。
(1) 用一般比较指令 CMP实现 LEA SI, DATA1 LEA DI, DATA2 MOV CX, NM2: MOV AL, [SI] CMP AL, [DI] JNZ M1 INC SI INC DI LOOP M2
MOV FLAG, 0FFHMOV FLAG, 0FFH JMP DONEJMP DONEM1: MOV FLAG, 0MOV FLAG, 0 MOV D1, SI MOV D2, DIDONE: ……
36
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
( 2 )用串操作指令 CMPS实现 LEA SI, DATA1 LEA DI, DATA2 MOV CX, N CLD REPZ CMPSB JNZ M3JNZ M3 MOV FLAG, 0FFHMOV FLAG, 0FFH JMP DONEJMP DONEM3: MOV FLAG, 0MOV FLAG, 0 DEC SI DEC DI MOV D1, SI MOV D2, DIDONE: ……
37
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
1 、利用高档机 32 位字长特性有两个 4 字长数分别存放在 DATA1 和 DATA2 中,求它们的和,结果存放于 DATA3 中。
DATA1 DQ 123456789ABCDEFHDATA2 DQ 0FEDCBA987654321HDATA3 DQ ?
在实模式下发挥在实模式下发挥 8038680386及其后继机的优及其后继机的优势势
38
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
CLC LEA SI, DATA1 LEA DI, DATA2 LEA BX, DATA3 MOV CX, 4MOV CX, 4BACK: MOV AX, [SI]MOV AX, [SI] ADC AX, [DI]ADC AX, [DI] MOV [BX], AXMOV [BX], AX
8086 中实现 :
INC SIINC SI INC SIINC SI INC DIINC DI INC DIINC DI INC BXINC BX INC BXINC BX LOOP BACKLOOP BACK
39
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
386及其后继机中实现: CLC LEA SI, DATA1 LEA DI, DATA2 LEA BX, DATA3 MOV CX, 2MOV CX, 2BACK: MOV EAX, [SI] ADC EAX, [DI] MOV [BX], EAX PUSHF PUSHF ;保存;保存 CCFF ADD SI, 4ADD SI, 4 ADD DI, 4ADD DI, 4 ADD BX, 4ADD BX, 4 POPFPOPF LOOP BACK
40
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
386及其后继机中实现:MOV EAX, DWORD PTR DATA1MOV EAX, DWORD PTR DATA1ADD EAX, DWORD PTR DATA2ADD EAX, DWORD PTR DATA2MOV EDX, DWORD PTR DATA+4ADC EDX, DWORD PTR DATA2+4MOV DWORD PTR DATA3, EAXMOV DWORD PTR DATA3, EAXMOV DWORD PTR DATA3+4, EDXMOV DWORD PTR DATA3+4, EDX
41
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
2 、通用寄存器可作为指针寄存器使用使用 3232 位寻址时,位寻址时, 3232 位通用寄存器可作为基址位通用寄存器可作为基址或变址寄存器使用或变址寄存器使用例: MOV EAX, [BX] MOV EAX, [EDX] MOV AX, WORD PTR [ECX] MOV AX, [EBX][EBX]
注意:注意: 实模式下,段的大小限制于实模式下,段的大小限制于 64KB64KB ,, 3232 位通用位通用寄存器作为指针寄存器时,高寄存器作为指针寄存器时,高 1616 位应为位应为 00
42
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
3 、与比例因子有关的寻址方式把 5 个双字相加并保存结果
ARRAY DD 234556H,0F983F5H,6754AE2H, 0C5231239H,0AF34ACB4HRESULT DQ ? SUB EBX, EBX MOV EDX, EBX MOV EAX, EBX MOV CX, 5BACK: ADD EAX, ARRAY[EBX*4]ADD EAX, ARRAY[EBX*4] ADC EDX, 0ADC EDX, 0 INC EBXINC EBX DEC CXDEC CX JNZ BACKJNZ BACK MOV DWORD PTR RESULT, EAX MOV DWORD PTR RESULT+4, EDX
43
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
数据段中有一个 20 个字节的表和一个 20 个字的表,把字节表中每个数据作为表中的高位字节部分移入字表中。
XOR SI, SI XOR DI, DINEXT: MOV AX, WORD_TABLE[DI]MOV AX, WORD_TABLE[DI] MOV AH, BYTE_TABLE[SI]MOV AH, BYTE_TABLE[SI] MOV WORD_TABLE[DI], AXMOV WORD_TABLE[DI], AX INC SI ADD DI, 2 CMP SI, 20 JL NEXT
BYTE_TABLE DB 20 DUP(?)WORD_TABLE DW 20 DUP(?)
方法方法 11 :用一般寻址方式:用一般寻址方式
44
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
XOR ESI, ESINEXT: MOV AX, WORD_TABLE[ESI*2]MOV AX, WORD_TABLE[ESI*2] MOV AH, BYTE_TABLE[ESI]MOV AH, BYTE_TABLE[ESI] MOV WORD_TABLE[ESI*2], AXMOV WORD_TABLE[ESI*2], AX INC ESI CMP ESI, 20 JL NEXT
方法方法 22 :用比例变址寻址方式:用比例变址寻址方式
45
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
宏定义、宏调用与宏展开宏定义、宏调用与宏展开
宏定义是源程序中一段有独立功能的程序代码。将这一段程序定义为一条宏指令,并具有一个相应的宏指令名,在程序中就可以多次调用它,调用时只需要引用一个宏指令名来代替这一段程序就可以了。在汇编的时候,汇编程序会自动将这个宏指令扩展成整段程序。
46
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
宏定义宏定义宏定义有两种格式 : 1 、简单宏定义 宏名 宏名 MACROMACRO …… …… ;宏体;宏体 …… …… ;宏体;宏体 ENDM ENDM 简单宏定义示例
CRLFCRLF MACRO MACRO MOV AH, 02H MOV DL, 0DH ;回车 INT 21H MOV DL, 0AH ;换行 MOV AH, 02H INT 21HENDMENDM
简单宏定义示例CRLFCRLF MACRO MACRO MOV AH, 02H MOV DL, 0DH ;回车 INT 21H MOV DL, 0AH ;换行 MOV AH, 02H INT 21HENDMENDM
47
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
带形参的宏定义示例 MULTIPLY MACRO OPR1, OPR2, RESULTMULTIPLY MACRO OPR1, OPR2, RESULT PUSH DX PUSH AX MOV AX, OPR1OPR1 IMUL OPR2OPR2 MOV RELUSTRELUST, AX MOV RESULT+2RESULT+2, DX POP AX POP DX ENDMENDM
带形参的宏定义示例 MULTIPLY MACRO OPR1, OPR2, RESULTMULTIPLY MACRO OPR1, OPR2, RESULT PUSH DX PUSH AX MOV AX, OPR1OPR1 IMUL OPR2OPR2 MOV RELUSTRELUST, AX MOV RESULT+2RESULT+2, DX POP AX POP DX ENDMENDM
2 、带形参的宏定义 宏名 宏名 MACRO <MACRO <形参表形参表 >> …… …… ;宏体;宏体 …… …… ;宏体;宏体 ENDMENDM
48
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
宏调用宏调用宏调用有两种格式:1 、对简单的宏定义的调用:宏名宏名2 、带形参的宏定义的调用:宏名宏名 <<实参表实参表 >>
宏调用示例 CRLF
MULTIPLY CX, VAR, XYZ[BX]
MULTIPLY 240, BX, SAVE
宏调用示例 CRLF
MULTIPLY CX, VAR, XYZ[BX]
MULTIPLY 240, BX, SAVE
49
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
宏扩展(宏展开)宏扩展(宏展开)宏扩展——汇编程序对汇编源程序汇编时将宏体宏扩展——汇编程序对汇编源程序汇编时将宏体 插入到宏调用处插入到宏调用处
MULTIPLY宏扩展示例+ PUSH DX
+ PUSH AX + MOV AX, CXCX + IMUL VARVAR + MOV XYZ[BX]XYZ[BX],AX ;实参替换形参 + MOV XYZ[BX]+2XYZ[BX]+2,DX + POP AX + POP DX 说明:说明: 汇编程序在所展开的指令前加‘汇编程序在所展开的指令前加‘ +’+’ 号以示区别号以示区别
MULTIPLY宏扩展示例+ PUSH DX
+ PUSH AX + MOV AX, CXCX + IMUL VARVAR + MOV XYZ[BX]XYZ[BX],AX ;实参替换形参 + MOV XYZ[BX]+2XYZ[BX]+2,DX + POP AX + POP DX 说明:说明: 汇编程序在所展开的指令前加‘汇编程序在所展开的指令前加‘ +’+’ 号以示区别号以示区别
50
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
宏指令与子程序的区别 宏指令与子程序的区别
子程序 宏指令 程序执行期间 在汇编期间展开 由主程序调用 它只占有自身 与调用次数有关,每调用一次它只占有自身 与调用次数有关,每调用一次 大小的空间 就把宏定义体展开一次大小的空间 就把宏定义体展开一次 执行时需增加时间 直接执行宏体 上的额外开销
51
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
52
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
宏定义的进一步讨论:宏定义的进一步讨论:11 、宏定义可以无变元、宏定义可以无变元22 、变元可以是操作码、变元可以是操作码宏定义:宏定义: FOO MACRO P1, P2P2, P3 MOV AX, P1 P2 P2 P3 ENDM 宏调用:宏调用: FOO WORD_VAR, INCINC, AX 宏展开:宏展开: + MOV AX, WORD_VAR + INCINC AX
53
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
33 、变元可以是操作码的一部分,必须用、变元可以是操作码的一部分,必须用 && 作为分隔符作为分隔符
宏定义:宏定义: LEAP MACRO CONDCOND, LAB J&CONDJ&COND LAB ENDM 宏调用:宏调用: LEAP CC, THERE
宏展开:宏展开: + JCJC THERE
54
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
44 、变元是、变元是 ASCIIASCII 串串
宏定义:宏定义: MSGGEN MACRO LAB, NUM, XYZXYZ LAB&NUM DB ‘HELLO MR.&XYZXYZ’ ENDM
宏调用:宏调用: MSGGEN MSG, 1, TAYLORTAYLOR
宏展开:宏展开: + MSG1 DB ‘HELLO MR.TAYLORTAYLOR’
55
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
55 、宏定义体内允许使用标号、宏定义体内允许使用标号 , , 此时,须使用此时,须使用 LOCALOCALL伪操作伪操作
宏定义:宏定义: ABSOL MACRO OPER LOCAL NEXTLOCAL NEXT CMP OPER, 0 JGE NEXTNEXT NEG OPER NEXT:NEXT: ENDM宏调用:宏调用: ABSOL VAR …… ABSOL BX
宏展开:宏展开: + CMP VAR, 0 + JGE ??0000??0000 + NEG VAR + ??0000??0000: …… + CMP BX, 0 + JGE ??0001??0001 + NEG BX + ??0001??0001:
56
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
66 、宏定义中可以使用宏调用,(必须先定义后调用)、宏定义中可以使用宏调用,(必须先定义后调用)宏定义:宏定义: DIF MACRO X, YDIF MACRO X, Y MOV AX, XMOV AX, X SUB AX, YSUB AX, Y ENDMENDM DIFSQR MACRO OPR1, OPR2, RESULT PUSH DX PUSH AX DIF OPR1, OPR2DIF OPR1, OPR2 IMUL AX MOV RESULT, AX POP AX POP DX ENDM
57
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
在在 VC++VC++ 中嵌入汇编语言指令中嵌入汇编语言指令本节类容适合在本节类容适合在 Visual C++5.0/60Visual C++5.0/60 中使用中使用格式格式 11 :: _asm_asm {{ 汇编语言指令汇编语言指令 }}
格式格式 22 :: _asm _asm 汇编语言指令汇编语言指令
说明 :1 )格式 1 中 { } 内可以是 1条也可以是多条汇编指令
2 )格式 2只能跟一条汇编语言指令 3 )有些版本的 VC需要使用 __asm (两个下划
线)
58
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
嵌入汇编示例 1_asm_asm{{ mov eax, 01h mov dx, 0xD007 out dx, eax}}
嵌入汇编示例 1_asm_asm{{ mov eax, 01h mov dx, 0xD007 out dx, eax}}
嵌入汇编示例 2_asm_asm mov eax, 01h_asm_asm mov dx, 0xD007_asm_asm out dx, eax
嵌入汇编示例 2_asm_asm mov eax, 01h_asm_asm mov dx, 0xD007_asm_asm out dx, eax
59
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
在在 _asm_asm 中使用汇编语言的注意事项:中使用汇编语言的注意事项:1.1. 嵌入式汇编支持嵌入式汇编支持 8048680486 的全部指令系统。的全部指令系统。 VC++5/6VC++5/6
还支持还支持MMXMMX 指令集。指令集。2.2. 对于不支持的指令,对于不支持的指令, VCVC 提供提供 _emit_emit 伪指令进行扩展伪指令进行扩展
#define cpi_id _asm _emit 0x0F _asm _emit 0XA2#define cpi_id _asm _emit 0x0F _asm _emit 0XA2
_asm { cpu_id} // _asm { cpu_id} // 使用使用 C++C++ 的宏的宏3.3. 嵌入式汇编代码可以使用嵌入式汇编代码可以使用 MASMMASM 的表达式来产生一的表达式来产生一
个数值或地址个数值或地址4.4. 嵌入式汇编行可以采用嵌入式汇编行可以采用 C++C++或或MASMMASM 的注释风格的注释风格5.5. 嵌入式汇编可以使用嵌入式汇编可以使用 C++C++ 的数据类型和数据对象,的数据类型和数据对象,但是不能使用但是不能使用 MASMMASM 的伪指令和操作符定义数据,的伪指令和操作符定义数据,如如 DB, DW, DUPDB, DW, DUP 等等
60
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
6.6. 嵌入式汇编不支持嵌入式汇编不支持MASMMASM 的宏指令,也不支持大部的宏指令,也不支持大部分分 MASMMASM伪指令伪指令
7.7. 用汇编语言编写的函数中,不必保存用汇编语言编写的函数中,不必保存 EAX/EBX/ECEAX/EBX/EC
X/EDX/ESIX/EDX/ESI 和和 EDIEDI 寄存器,但是必须保存函数中使寄存器,但是必须保存函数中使用的其他寄存器用的其他寄存器
8.8. 嵌入式汇编代码可以使用嵌入式汇编代码可以使用 LENGTHLENGTH (返回数组元素(返回数组元素个数)、 个数)、 TYPETYPE (返回 (返回 C++C++类型或变量的大小)类型或变量的大小)、 、 SIZESIZE (( LENGTH×TYPELENGTH×TYPE )操作符。)操作符。
对于数据 对于数据 int iarray[8]int iarray[8] (( intint类型是类型是 3232 位位 ,4,4 字节),则:字节),则:LENGTH iarray LENGTH iarray 返回返回 8 8 TYPE iarray TYPE iarray 返回返回 44SIZE iarray SIZE iarray 返回返回 3232
对于数据 对于数据 int iarray[8]int iarray[8] (( intint类型是类型是 3232 位位 ,4,4 字节),则:字节),则:LENGTH iarray LENGTH iarray 返回返回 8 8 TYPE iarray TYPE iarray 返回返回 44SIZE iarray SIZE iarray 返回返回 3232
61
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
在在 _asm_asm 中使用中使用 C++C++ 语言的注意事项:语言的注意事项:1.1. 嵌入式汇编代码可以使用嵌入式汇编代码可以使用 C++C++ 的符号(包括标号、的符号(包括标号、
变量、函数名)、常量(包括符号常量、枚举成员变量、函数名)、常量(包括符号常量、枚举成员)、宏和预处理指令、注释、类型名及结构、联合)、宏和预处理指令、注释、类型名及结构、联合的成员。的成员。
2.2. 每一个汇编语句只能包含一个每一个汇编语句只能包含一个 C++C++ 符号,且不能使符号,且不能使用和用和 MASMMASM 保留字相同的保留字相同的 C++C++ 符号,也不识别符号,也不识别 strstr
uctuct 和和 unionunion 关键字关键字3.3. _asm_asm 中引用函数前必须在程序说明其原型中引用函数前必须在程序说明其原型4.4. 嵌入式汇编语句中可以使用汇编语言格式表示整数嵌入式汇编语句中可以使用汇编语言格式表示整数
常量,也可以采用常量,也可以采用 C++C++ 的格式(如的格式(如 0x37a0x37a ))
62
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
5.5. 嵌入式汇编语言中不能使用嵌入式汇编语言中不能使用 C++C++专用操作符,如专用操作符,如 <<
<< ,可以使用两种语言都有的操作符,可以使用两种语言都有的操作符6.6. 嵌入式汇编中可以引用包含该嵌入式汇编中可以引用包含该 _asm_asm 作用范围内的作用范围内的任何符号(包括变量),它通过使用变量名引用任何符号(包括变量),它通过使用变量名引用 C+C+
++ 的变量的变量7.7. 嵌入式会变中的标号的作用范围为定义它的函数中嵌入式会变中的标号的作用范围为定义它的函数中
有效,汇编转移指令和有效,汇编转移指令和 C++C++ 的的 gotogoto 指令都可以跳到指令都可以跳到_asm_asm 块内或块外的标号块内或块外的标号
8.8. _asm_asm 块中定义的标号对大小写不敏感,汇编语言指块中定义的标号对大小写不敏感,汇编语言指令跳转到令跳转到 C++C++ 中的标号也大小写不敏感,但中的标号也大小写不敏感,但 C++C++ 的的gotogoto 语句跳转的标号大小写敏感语句跳转的标号大小写敏感
63
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
int array[6]struct first_type{ char *carray; int same_name;} ftype;struct second_type{ int same_name;} stype _asm{ mov array[6], dx mov ebx,OFFSET ftype mov ecx, [ebx].carray mov esi, [ebx]ftype.same_name}
使用 C++ 数据举例
64
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
嵌入式汇编举例:#include <iostream.h>int power2(int, int);void main(void) { cout<<"2 的 6 次方乘 5 等于 :\t"; cout<<power2(5,6)<<endl;}int power2(int num, int power) { _asm { mov eax, num ; 取第一个参数 mov ecx, power ; 取第二个参数 shl eax, cl ; 计算 EAX=EAX× ( 2CL ) } // 返回值存于 EAX}
65
现代微机原理与接口技术现代微机原理与接口技术
http://www.njyangqs.com/http://www.njyangqs.com/
汇编语言通过参数名就可以引用参数,采用 return返回出口参数,也可以不写 return ,编译时可能有警告。返回值的约定返回值的约定:•≤32 位的数据扩展到 32 位,存放在 EAX 中返回•4~ 8 字节的返回值存放在 EDX.EAX 中返回•更大的字节数据将它的地址指针存放在 EAX 中返回