TIOBE 2018 8 TOP 20 https www tiobe
TIOBE 2018 8 TOP 20 https: //www. tiobe. com/tiobe-index/ 年 月 编 程 语 言 排 行 榜 榜 单 13
IEEE Spectrum 2018 年度编程语言排行榜 https: //spectrum. ieee. org/static/interactive-the-top-programming-languages-2018 14
(一)概述 Translating Languages English: Display the sum of A times B plus C. C++: cout << (A * B + C); Assembly Language: Intel Machine Language: mov eax, A mul B add eax, C call Write. Int A 1 F 7 03 E 8 0000 25 00000004 05 00000008 00500000 15
(一)概述 1. Hello world 程序 DOS ( 实 模 式 ) stack segment stack db 100 dup (? ) stack ends data segment message db 'Hello, world', 0 dh, 0 ah, '$' data ends code segment assume cs: code, ds: data, ss: stack start: mov ax, data mov ds, ax mov ah, 9 mov dx, offset message int 21 h mov ah, 4 ch int 21 h code ends end start 完整 段定义 下 16
(一)概述 1. Hello world 程序 Windows ( 保 护 模 式 ) . 386. model flat, stdcall Message. Box. A PROTO, h. Wnd: DWORD, lp. Text: PTR BYTE, lp. Caption: PTR BYTE, style: DWORD Exit. Process PROTO, exit. Code: DWORD. data sz. Caption db 'A Message. Box !', 0 sz. Text db 'Hello, World !', 0. code start: push 0 ; MB_OK push offset sz. Caption push offset sz. Text push 0 ; NULL call Message. Box. A push 0 call Exit. Process end start 下 18
(一)概述 1. Hello world 程序 . 386. model flat, stdcall Graph. Win. inc user 32. lib kernel 32. lib . data sz. Caption sz. Text db db 'A Message. Box !', 0 'Hello, World !', 0 . code start: invoke 保 护 模 式 ) end invoke start Message. Box, NULL, offset sz. Text, offset sz. Caption, MB_OK Exit. Process, NULL Windows ( INCLUDE includelib 下 使用include、includelib、invoke伪指令 19
(一)概述 3. 汇编语言源程序的结构 1)完整段定义的程序结构 STACK SEGMENT PARA STACK ‘STACK’ DB 500 DUP(0) STACK ENDS DATA SEGMENT 段名 对齐方式 组合方式 '类' ………… DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA, ES: DATA, SS: STACK START: MOV AX, DATA MOV DS, AX MOV ES, AX ………… MOV AH, 4 CH INT 21 H CODE ENDS END START 22
(一)概述 5. 编译、链接和运行程序 Link library Source file Step 2: Assembler Object file Listing file Step 1: Text editor 有错 Step 3: Linker Step 4: Executable OS loader Output file Map file 有错 有错 29
(二)汇编语言的基本元素 3. 字符、字符串常量 例: 'A' "d" 'ABC' "Goodnight, Gracie" '4096' "This isn't a test" 'Say "Goodnight, " Gracie' 36
(三)例子:加减法. 386. MODEL flat, stdcall. STACK 4096 Exit. Process PROTO, dw. Exit. Code: DWORD Dump. Regs PROTO. code main PROC mov eax, 10000 h add eax, 40000 h sub eax, 20000 h call Dump. Regs ; EAX = 10000 h ; EAX = 50000 h ; EAX = 30000 h INVOKE Exit. Process, 0 main ENDP END main 41
(四)定义数据 数据定义语句: [名称] 数据定义伪指令 初始值[, 初始值]… Intel处理器采用小尾顺序: 例: 78 h (小端存储方式) Value 3 : . data value 3+ 1: 56 h value 1 BYTE 10 h value 3+ 2: 34 h value 2 BYTE ? value 3+ 3: 12 h list 1 BYTE 10, 20, 30, 40 BYTE 50, 60, 70, 80 list 2 BYTE 32, 41 h, 0010 b, 'a' greeting BYTE "Good afternoon", 0 dh, 0 ah, 0 array WORD 5 DUP(? ) ; 5个未初始化的值 value 3 DWORD 12345678 h 43
(五)符号常量:不占用任何实际的存储空间。 n 等号伪指令 例: COUNT = 500 ESC_key = 27 array COUNT DUP(0) mov cx, COUNT mov al, ESC_key n EQU伪指令 n TEXTEQU伪指令 44
(五)符号常量:不占用任何实际的存储空间。 n 计算数组和字符串的大小 例: list 1 BYTE 10, 20, 30, 40 List 1 Size = ($ - list 1) my. String BYTE "This is a long string, " BYTE " Containing any number" BYTE " of characters", 0 dh, 0 ah My. String_len = ($ - my. String) list 2 WORD 1000 h, 2000 h, 3000 h, 4000 h List 2 Size = ($ - list 2)/2 45
(六)例子:加减法-实地址模式,添加变量. MODEL small, stdcall. 386 Dump. Regs PROTO. STACK 4096. data val 1 DWORD 10000 h val 2 DWORD 40000 h val 3 DWORD 20000 h final. Val DWORD ? . code main PROC mov ax, @data mov ds, ax mov eax, val 1 add eax, val 2 sub eax, val 3 mov final. Val, eax call Dump. Regs mov ah, 4 Ch mov al, 0 int 21 h main ENDP END main ; ; ; data seg address copy to DS copy to ES EAX = 10000 h EAX = 50000 h EAX = 30000 h store the result display registers exit process return code = 0 call MS-DOS function 46
(一)数据传送指令 n n n 3. MOV指令格式: mov reg, reg mov mem, reg mov reg, mem mov mem, imm mov reg, imm 段寄存器仅用于实地址模式下运行的程序。 mov r/m 16, sreg. data mov sreg, r/m 16 var 1 WORD ? var 2 WORD ? 内存之间的移动. code 通过寄存器暂存。 mov ax, var 1 mov var 2, ax 53
(一)数据传送指令 4. 整数的零/符号扩展 1)MOVZX指令 n 含义:move with zero-extend n 格式: movzx r 32, r/m 8 movzx r 32, r/m 16 movzx r 16, r/m 8 0 10001101 0000 10001101 源操作数 目的操作数 54
(一)数据传送指令 4. 整数的零/符号扩展 1)MOVZX指令 例: movzx bx, 0 A 69 Bh eax, bx edx, bl cx, bl . data byte 1 BYTE 9 Bh word 1 WORD 0 A 69 Bh. code …… movzx eax, word 1 movzx edx, byte 1 movzx cx, byte 1 …… 55
(一)数据传送指令 4. 整数的零/符号扩展 2)MOVSX指令 n 含义:move with sign-extend n 格式: 例: movsx r 32, r/m 8 mov bx, 0 A 69 Bh movsx r 32, r/m 16 movsx eax, bx movsx r 16, r/m 8 movsx edx, bl movsx cx, bl 10001101 1111 10001101 源操作数 目的操作数 eax = FFFFA 69 Bh edx = FFFFFF 9 Bh cx = FF 9 Bh 56
(一)数据传送指令 n n 5. XCHG指令 含义:exchange data,交换两个操作数的内容。 格式: 例: xchg reg, reg xchg ax, bx xchg reg, mem xchg ah, al xchg mem, reg xchg var 1, bx xchg eax, ebx n 交换两个内存操作数: 利用寄存器,MOV与XCHG结合使用。 mov ax, val 1 xchg ax, val 2 mov val 1, ax 57
(一)数据传送指令 6. 直接偏移操作数 例:. data array. B BYTE 10 h, 20 h, 30 h, 40 h, 50 h. code mov al, array. B ; AL=10 h mov al, [array. B+1] ; AL=20 h mov al, [array. B+2] ; AL=30 h mov al, [array. B+20] ; AL=? ? 注意: n MASM并不要求一定要使用方括号。 n MASM对有效地址没有内建的范围检查模块。 58
(一)数据传送指令 6. 直接偏移操作数 例:字和双字数组. data array. W WORD 100 h, 200 h, 300 h. code mov ax, array. W ; AX=100 h mov ax, [array. W+2] ; AX=200 h. data array. D DWORD 10000 h, 20000 h. code mov eax, array. D ; EAX=10000 h mov eax, [array. D+4] ; EAX=20000 h 59
(二)加法和减法 n n n 1. INC和DEC指令 含义:increment和decrement,加 1、减 1。 格式: inc reg/mem dec reg/mem 例:. data my. Word WORD 1000 h. code inc my. Word ; 1001 h mov bx, my. Word dec bx ; 1000 h 60
(二)加法和减法 5. 例子: 实现算术表达式 Rval = -Xval + (Yval – Zval). data Rval SDWORD ? Xval SDWORD 26 Yval SDWORD 30 Zval SDWORD 40. code mov eax, Xval neg eax ; EAX = -26 mov ebx, Yval sub ebx, Zval ; EBX = -10 add eax, ebx mov Rval, eax ; -36 64
6. 算术运算影响的标志 (二)加法和减法 n 零标志和符号标志 mov sub mov inc cx, 1 ax, 0 FFFFh ax ax mov cx, 0 sub cx, 1 add cx, 2 ; ZF = 1 ; ZF = 0 ; SF = 1 ; SF = 0 65
(二)加法和减法 7. 例子程序(Add. Sub 3) . 386 ; Zero flag example: . MODEL flat, stdcall mov cx, 1. STACK 4096 sub cx, 1 ; ZF = Exit. Process PROTO, dw. Exit. Code: DWORD mov ax, 0 FFFFh. data inc ax ; ZF = Rval SDWORD ? ; Sign flag example: Xval SDWORD 26 mov cx, 0 Yval SDWORD 30 sub cx, 1 ; SF = Zval SDWORD 40 mov ax, 7 FFFh. code add ax, 2 ; SF = main PROC ; Carry flag example: mov ax, 1000 h ; INC and DEC mov al, 0 FFh inc ax ; 1001 h add al, 1 ; CF = dec ax ; 1000 h ; Overflow flag example: ; Expression: Rval = -Xvalmov + (Yval - Zval) al, +127 mov eax, Xval add al, 1 ; OF = neg eax ; -26 mov al, -128 mov ebx, Yval sub al, 1 ; OF = sub ebx, Zval ; -10 INVOKE Exit. Process, 0 add eax, ebx main ENDP mov Rval, eax ; -36 END main 1 1 1, AL = 00 1 1 69
(三)和数据相关的操作符和伪指令 1. OFFSET操作符 n 例:假设b. Val位于00303000 h处。. data b. Val BYTE ? w. Val WORD ? d. Val 1 DWORD ? d. Val 2 DWORD ? . code …… mov esi, OFFSET b. Val ; ESI = 00303000 mov esi, OFFSET w. Val ; ESI = 00303001 mov esi, OFFSET d. Val 1 ; ESI = 00303003 mov esi, OFFSET d. Val 2 ; ESI = 00303007 mov esi, OFFSET b. Val + 1 OFFSET操作符与直接偏移操作数联合使用 …… 72
(三)和数据相关的操作符和伪指令 2. PTR操作符 偏移 例: my. Double 0000 my. Double+1 0001 my. Double+2 0002 字节 78 56 34 my. Double+3 0003 12 . data my. Double DWORD 12345678 h. code mov ax, my. Double ; 错误 mov ax, WORD PTR my. Double ; ax 5678 h = ? mov ax, WORD PTR [my. Double+2] ; ax = ? 1234 h mov bl, BYTE PTR my. Double ; bl 78 h = ? 74
(三)和数据相关的操作符和伪指令 3. TYPE操作符 n 返回按字节计算的变量的单个元素的大小。 n 例:. data var 1 BYTE ? var 2 WORD ? 表达式 值 var 3 DWORD ? TYPE var 1 1 var 4 QWORD ? TYPE var 2 TYPE var 3 2 4 TYPE var 4 8 75
(三)和数据相关的操作符和伪指令 4. LENGTHOF操作符 n 计算数组中元素的个数。 n 例: 表达式 LENGTHOF byte 1 LENGTHOF array 2. data byte 1 array 2 arrar 3 digit. Str LENGTHOF array 3 LENGTHOF digit. Str BYTE 10, 20, 30 WORD 30 DUP(? ), 0, 0 WORD 5 DUP(3 DUP(? )) DWORD 1, 2, 3, 4 BYTE "12345678", 0 值 3 30+2 5× 3 4 9 76
(三)和数据相关的操作符和伪指令 5. SIZEOF操作符 SIZEOF返回值=LENGTHOF返回值×TYPE返回值 例:. data int. Array WORD 32 DUP(0) 表达式 TYPE int. Array LENGTHOF int. Array SIZEOF int. Array 值 2 32 64 77
(四)间接寻址 2. 数组 例:三个双字相加. data array. D DWORD 10000 h, 20000 h, 30000 h. code mov esi, OFFSET array. D mov eax, [esi] add esi, 4 add eax, [esi] 81
(四)间接寻址 3. 变址操作数(寄存器相对寻址) 例:. data array. B BYTE 10 h, 20 h, 30 h. code mov esi, 0 mov al, [array. B + esi] ; mov al, array. B[esi] ; mov esi, OFFSET array. B mov al, [esi] ; mov al, [esi+1] ; mov al, [esi+2] ; n AL = 10 h 同上,另一种格式 AL = 10 h AL = 20 h AL = 30 h 实模式下只能使用SI,DI,BX,BP寄存器。 (尽量避免使用BP寄存器) 82
(五)JMP和LOOP指令 1. JMP指令 例:创建一个循环 top: . . . jmp top ; repeat the endless loop 84
(五)JMP和LOOP指令 n 2. LOOP指令 例: mov L 1: inc loop ax, 0 ecx, 5 ax L 1 5 0 循环结束时,AX=? ECX=? 86
(五)JMP和LOOP指令 3. 例子: 整数数组求和 ; This program sums an array of words. (Sum. Array. asm). 386. MODEL flat, stdcall. STACK 4096 Exit. Process PROTO, dw. Exit. Code: DWORD. data intarray WORD 100 h, 200 h, 300 h, 400 h. code main PROC mov edi, OFFSET intarray ; address of intarray mov ecx, LENGTHOF intarray ; loop counter mov ax, 0 ; zero the accumulator L 1: add ax, [edi] ; add an integer add edi, TYPE intarray ; point to next integer loop L 1 ; repeat until ECX = 0 INVOKE Exit. Process, 0 main ENDP END main 88
(五)JMP和LOOP指令 4. 例子: 拷贝字符串 TITLE Copying a String (Copy. Str. asm) ; This program copies a string. INCLUDE Irvine 32. inc. data source BYTE "This is the source string", 0 target BYTE SIZEOF source DUP(0), 0. code main PROC mov esi, 0 ; index register mov ecx, SIZEOF source ; loop counter L 1: mov al, source[esi] ; get a character from source mov target[esi], al ; store it in the target inc esi ; move to next character loop L 1 ; repeat for entire string INVOKE Exit. Process, 0 main ENDP END main 89
(一)与外部库链接 背景知识 链接器的命令行选项 例: Link 32 /subsystem: windows Hello. Win. obj user 32. lib kernel 32. lib 你的程序 链接到 user 32. lib 运行 user 32. dll kernel 32. lib 运行 kernel 32. dll kernel 32. lib可以在Microsoft Windows平台软件开 发包(platform SDK)中找到,它包含了存储在另一个 文件 —— kernel 32. dll 中的操作系统函数的链接信息。 97
(二)堆栈操作 n 1. 堆栈:② 出栈操作 出栈(POP)操作从堆栈顶端移走一个值并将其置于 寄存器或变量中。在值从栈顶弹出后,堆栈指针相应 增加。 出栈之前 00000 FF 0 00000002 00000 FF 8 00000001 00000 FFC 000000 A 5 00001000 00000006 00000 FF 4 出栈之后 00000 FF 0 ESP 00000 FF 4 00000001 00000 FFC 000000 A 5 00001000 00000006 00000 FF 8 ESP 100
2. PUSH 和 POP 指令 ⑤ 例子:翻转字符串 TITLE Program Template (Rev. Str. asm) ; This program reverses a string. INCLUDE Irvine 32. inc. data a. Name BYTE "Abraham Lincoln", 0 name. Size = ($ - a. Name) - 1. code main PROC ; Push the name on the stack. mov ecx, name. Size mov esi, 0 L 1: movzx eax, a. Name[esi] push eax inc esi Loop L 1 ; get character ; push on stack 109
2. PUSH 和 POP 指令 ⑤ 例子:翻转字符串 ; Pop the name from the stack, in reverse, ; and store in the a. Name array. mov ecx, name. Size mov esi, 0 L 2: pop eax ; get character mov a. Name[esi], al ; store in string inc esi Loop L 2 ; Display the name. mov edx, OFFSET a. Name call Writestring call Crlf exit main ENDP END main 110
(三)过程的定义和使用 1. PROC伪指令 ② 例子:三个整数之和 Sum. Of add ret Sum. Of PROC eax, ebx eax, ecx ENDP 113
(三)过程的定义和使用 ③ 为过程添加文档 1. PROC伪指令 ; ----------------------------Sum. Of PROC ; ; Calculates and returns the sum of three 32 -bit integers. ; Receives: EAX, EBX, ECX, the three integers. May be ; signed or unsigned. ; Returns: EAX = sum, and the status flags (Carry, ; Overflow, etc. ) are changed. ; ----------------------------add eax, ebx add eax, ecx ret Sum. Of ENDP 115
(三)过程的定义和使用 ① 调用和返回的例子 2. CALL和RET指令 main PROC. 00000020 call My. Sub 00000025 mov eax, ebx. main ENDP My. Sub PROC 00000040 mov eax, edx. . ret My. Sub ENDP CALL指令执行时: RET指令执行时: 00000025 EIP 00000040 EIP 00000025 ESP 116
(三)过程的定义和使用 ② 过程的嵌套调用 2. CALL和RET指令 main PROC. . call Sub 1 exit main ENDP Sub 2 PROC. . call Sub 3 ret Sub 2 ENDP Sub 1 PROC. . call Sub 2 ret Sub 1 ENDP Sub 3 PROC. . . ret Sub 3 ENDP 117
(三)过程的定义和使用 2. CALL和RET指令 ④ 向过程传递寄存器参数 例:. data the. Sum DWORD ? . code main PROC mov eax, 10000 h mov ebx, 20000 h mov ecx, 30000 h call Sum. Of mov the. Sum, eax ; argument ; EAX=(EAX+EBX+ECX) ; save the sum 119
(三)过程的定义和使用 n Array. Sum 过程: 3. 例子:对整数数组求和 ; --------------------------Array. Sum PROC ; ; Calculates the sum of an array of 32 -bit integers. ; Receives: ESI points to the array, ECX = array size ; Returns: EAX = sum of the array elements ; --------------------------push esi ; save ESI, ECX push ecx mov eax, 0 ; set the sum to zero L 1: add eax, [esi] ; add each integer to sum add esi, 4 ; point to next integer loop L 1 ; repeat for array size pop ecx pop esi ret Array. Sum ENDP ; restore ECX, ESI ; sum is in EAX 120
(三)过程的定义和使用 n 调用 Array. Sum : 3. 例子:对整数数组求和 . data array DWORD 10000 h, 20000 h, 30000 h, 40000 h, 50000 h the. Sum DWORD ? . code main PROC mov esi, OFFSET array ; ESI points to array mov ecx, LENGTHOF array ; ECX = array count call Array. Sum ; calculate the sum mov the. Sum, eax ; returned in EAX. . . 122
- Slides: 121