《汇编语言 基于x86处理器》第九章字符串与数组部分的代码

? 书中第九章的程序,主要讲了

● 代码,Irvine32 中的字符串库函数代码范例

 1 INCLUDE Irvine32.inc
 2
 3 .data
 4 str1    BYTE "abcde////", 0
 5 str2    BYTE "ABCDE", 0
 6 msg0    BYTE "Upper case: ", 0
 7 msg1    BYTE "str1 == str2", 0
 8 msg2    BYTE "str1 < str2", 0
 9 msg3    BYTE "str1 > str2", 0
10 msg4    BYTE "Length of str1: ", 0
11 msg5    BYTE "Trimming: ", 0
12
13 .code
14 main PROC
15     mov     edx, OFFSET str1
16     call    WriteString
17     call    crlf
18
19     call    trim_string
20     call    upper_case
21     call    compare_strings
22     call    print_length
23     call    waitmsg
24     exit
25 main ENDP
26
27 trim_string PROC                        ; 去掉结尾的指定字符
28     INVOKE  Str_trim, ADDR str1, ‘/‘
29     mov     edx, OFFSET msg5
30     call    WriteString
31     mov     edx, OFFSET str1
32     call    WriteString
33     call    Crlf
34     ret
35 trim_string ENDP
36
37 upper_case PROC                         ; 小写转大写
38     mov     edx, OFFSET msg0
39     call    WriteString
40     INVOKE  Str_ucase, ADDR str1
41     mov     edx, OFFSET str1
42     call    WriteString
43     call    Crlf
44     ret
45 upper_case ENDP
46
47 compare_strings PROC                    ; 比较 str1 和 str2
48     INVOKE Str_compare, ADDR str1, ADDR str2
49     .IF ZERO?
50     mov     edx, OFFSET msg1     ; str1 = str2
51     .ELSEIF CARRY?
52     mov     edx, OFFSET msg2     ; str1 < str2
53     .ELSE
54     mov     edx, OFFSET msg3     ; str1 > str2
55     .ENDIF
56     call    WriteString
57     call    Crlf
58     ret
59 compare_strings  ENDP
60
61 print_length PROC                       ; 获取字符串长度
62     mov     edx, OFFSET msg4
63     call    WriteString
64     INVOKE  Str_length, ADDR str1
65     call    WriteDec
66     call    Crlf
67     ret
68 print_length ENDP
69
70 END main

■ 输出结果

abcde////
Trimming: abcde
Upper case: ABCDE
str1 == str2
Length of str1: 5

● 二维表下标引用

 1 INCLUDE Irvine32.inc
 2
 3 .data
 4 tableB  BYTE   10h,   20h,   30h,   40h,   50h  ; 数组定义能断开,中间插入一个用于计算数组行宽的常量
 5 Rowsize = ($ - tableB)
 6         BYTE   60h,   70h,   80h,   90h,  0A0h
 7         BYTE  0B0h,  0C0h,  0D0h,  0E0h,  0F0h
 8
 9 tableW  WORD   10h,   20h,   30h,   40h,   50h
10 RowsizeW = ($ - tableW)
11         WORD   60h,   70h,   80h,   90h,  0A0h
12         WORD  0B0h,  0C0h,  0D0h,  0E0h,  0F0h
13
14 tableD  DWORD 10000h,    20000h,   30000h,   40000h,   50000h
15 RowSizeD = ($ - tableD)
16         DWORD 60000h,    70000h,   80000h,   90000h,  0A0000h
17         DWORD 0B0000h,  0C0000h,  0D0000h,  0E0000h,  0F0000h
18
19 .code
20 main PROC
21
22 row = 1                                 ; 目标元素的下标
23 col = 2
24
25     mov     ebx, OFFSET tableB          ; 指向数组首元素
26     add     ebx, RowSize * row          ; 计算行偏移
27     mov     esi, col                    ; 列偏移
28     mov     al, [ebx + esi]             ; 取目标元素
29     call    DumpRegs                    ; AL = 80h
30
31     mov     ebx, OFFSET tableW          ; 相同的过程
32     add     ebx, RowSizeW * row
33     mov     esi, col
34     mov     ax, [ebx + esi*TYPE tableW] ; 元素不是 BYTE 时要乘以比例因子
35     call    DumpRegs                    ; AX = 0080h
36
37     mov     eax, row
38     mov     esi, col
39     call    get_tableDval               ; 使用函数寻找目标元素
40     call    WriteHex                    ; 目标元素在 eax 中
41     call    Crlf
42     call    WaitMsg
43     exit
44 main ENDP
45
46 get_tableDval PROC uses ebx
47     mov    ebx, RowSizeD
48     mul    ebx                                  ; eax *= RowSizeD,行偏移
49     mov    eax, tableD[eax + esi*TYPE tableD]   ; 加上列偏移再寻址
50     ret                                         ; eax = 80000h
51 get_tableDval ENDP
52
53 END main

● 代码,冒泡排序,二分搜索

 1 ; BinarySearchTest.asm,测试函数
 2 INCLUDE Irvine32.inc
 3 INCLUDE BinarySearch.inc
 4
 5 LOWVAL = -5000
 6 HIGHVAL = +5000
 7 ARRAY_SIZE = 50
 8
 9 .data
10 array DWORD ARRAY_SIZE DUP(?)
11
12 .code
13 main PROC
14     call    Randomize                                           ; 初始化随机数种子
15     INVOKE  FillArray, ADDR array, ARRAY_SIZE, LOWVAL, HIGHVAL  ; 用随机数填充数组
16     INVOKE  PrintArray, ADDR array, ARRAY_SIZE                  ; 显示数组内容
17     call    WaitMsg
18     call    Crlf
19
20     INVOKE  BubbleSort, ADDR array, ARRAY_SIZE          ; 冒泡排序
21     INVOKE  PrintArray, ADDR array, ARRAY_SIZE
22     call    WaitMsg
23     call    Crlf
24
25     call    AskForSearchVal                             ; 输入待查找的数字
26     INVOKE  BinarySearch, ADDR array, ARRAY_SIZE, eax   ; 二叉搜索
27     call    ShowResults                                 ; 输出搜索结果
28     call    WaitMsg
29
30     exit
31 main ENDP
32
33 AskForSearchVal PROC
34 .data
35 prompt BYTE "Signed integer to find: ",0
36 .code
37     call    Crlf
38     mov     edx, OFFSET prompt
39     call    WriteString
40     call    ReadInt
41     ret
42 AskForSearchVal ENDP
43
44 ShowResults PROC
45 .data
46 msg1 BYTE "Not found.",0
47 msg2 BYTE "Found at index:",0
48 .code
49 .IF eax == -1
50     mov     edx, OFFSET msg1
51     call    WriteString
52 .ELSE
53     mov     edx, OFFSET msg2
54     call    WriteString
55     call    WriteDec
56 .ENDIF
57     call    Crlf
58     ret
59 ShowResults ENDP
60
61 END main
 1 ; FillArray.asm,用 [LowerRange, UpperRange - 1] 之间随机的整数来填充数组
 2 INCLUDE Irvine32.inc
 3
 4 .code
 5 FillArray PROC USES eax edi ecx edx, pArray:PTR DWORD, Count:DWORD, LowerRange:SDWORD, UpperRange:SDWORD
 6
 7     mov     edi, pArray
 8     mov     ecx, Count
 9     mov     edx, UpperRange
10     sub     edx, LowerRange
11     cld                         ; 清除方向标志位
12
13 L1:
14     mov     eax, edx
15     call    RandomRange
16     add     eax, LowerRange
17     stosd                       ; eax 的值保存到 [edi]
18     loop    L1
19
20     ret
21 FillArray ENDP
22
23 END
 1 ; PrintArray.asm,打印数组
 2 INCLUDE Irvine32.inc
 3
 4 .code
 5 PrintArray PROC USES eax ecx edx esi, pArray:PTR DWORD, Count:DWORD
 6
 7 .data
 8 comma BYTE ", ",0               ; 逗号
 9 .code
10     mov     esi, pArray
11     mov     ecx, Count
12     cld
13
14 L1:
15     lodsd                       ; 读取 [ESI] 给 eax
16     call    WriteInt
17     mov     edx, OFFSET comma
18     call    Writestring
19     loop    L1
20
21     call    Crlf
22     ret
23 PrintArray ENDP
24
25 END
 1 ; BubbleSort.asm,冒泡排序
 2 INCLUDE Irvine32.inc
 3
 4 .code
 5 BubbleSort PROC USES eax ecx esi, pArray:PTR DWORD, Count:DWORD
 6
 7     mov     ecx, Count
 8     dec     ecx             ; 外层循环 ecx -->0
 9
10 L1:
11     push    ecx             ; 内层循环,保存 ecx
12     mov     esi, pArray
13
14 L2:
15     mov     eax, [esi]      ; 取出相邻两个元素作比较
16     cmp     [esi + 4] ,eax
17     jge     L3              ; pArray[esi] < pArray[esi + 1] 跳转,不发生交换
18     xchg    eax, [esi+4]
19     mov    [esi], eax
20
21 L3:
22     add    esi, 4           ; 后移一位
23     loop    L2
24
25     pop    ecx              ; 退到外层循环以前恢复 ecx
26     loop L1
27
28 L4:
29     ret
30 BubbleSort ENDP
31
32 END
 1 ; BinarySearch.asm,二分搜索
 2 INCLUDE Irvine32.inc
 3
 4 .code
 5 BinarySearch PROC USES ebx edx esi edi, pArray:PTR DWORD, Count:DWORD, searchVal:DWORD
 6
 7 LOCAL first:DWORD, last:DWORD, mid:DWORD
 8
 9     mov     first, 0
10     mov     eax, Count
11     dec     eax
12     mov     last, eax
13     mov     edi, searchVal
14     mov     ebx, pArray
15
16 L1:                         ; first <= last
17     mov     eax, first
18     cmp     eax, last
19     jg     L5               ; first > last,退出搜索
20
21     mov     eax, last       ; 计算 mid
22     add     eax, first
23     shr     eax, 1
24     mov     mid, eax
25
26     mov     esi, mid
27     shl     esi, 2              ; 下标乘以 4,变成数组偏移量
28     mov     edx, [ebx + esi]    ; EDX = pArray[mid]
29
30     cmp     edx, edi        ; 比较 edx 和 查找的值
31     jge     L2              ; edx >= searchval 跳转
32     mov     eax, mid        ; first = mid + 1
33     inc     eax
34     mov     first, eax
35     jmp     L4
36
37 L2:
38     cmp     edx,edi         ; 比较 edx 和 查找的值
39     jle     L3              ; edx <= searchval 跳转
40     mov     eax, mid        ; last = mid - 1
41     dec     eax
42     mov     last, eax
43     jmp     L4
44
45 L3:
46     mov     eax, mid        ; edx == searchval
47     jmp     L9              ; 返回,eax即为找到的下标
48
49 L4:
50     jmp     L1              ; 调整过 first 或 last,继续搜索
51
52 L5:
53     mov     eax, -1         ; 没找到
54 L9:
55     ret
56 BinarySearch ENDP
57
58 END

原文地址:https://www.cnblogs.com/cuancuancuanhao/p/9648847.html

时间: 2024-10-10 09:28:18

《汇编语言 基于x86处理器》第九章字符串与数组部分的代码的相关文章

《汇编语言 基于x86处理器》第十三章高级语言接口部分的代码 part 1

? 书中第十三章的程序,主要讲了汇编语言和 C/++ 相互调用的方法 ● 代码,数组求和的几种优化 1 int arraySum(int array[], int count) ; O0 2 { 3 010716D0 push ebp 4 010716D1 mov ebp,esp 5 010716D3 sub esp,0D8h 6 010716D9 push ebx 7 010716DA push esi 8 010716DB push edi 9 010716DC lea edi,[ebp-0

《汇编语言 基于x86处理器》第十一章 MS-DOS 编程部分的代码 part 2

? 书中第十一章的程序,主要讲了 Windows 接口,在小黑框中进行程序交互 ● 在屏幕指定位置输出带自定义属性的文字 1 INCLUDE Irvine32.inc 2 3 .data 4 outHandle HANDLE ? 5 cellsWritten DWORD ? ; 输出计数(输出参数) 6 xyPos COORD <10,2> ; 输出坐标 7 buffer BYTE 41h,42h,43h,44h,45h,46h,47h,48h,49h,4Ah,4Bh,4Ch,4Dh,4Eh,

《汇编语言 基于x86处理器》第十章结构和宏部分的代码

? 书中第十章的程序,主要讲了结构与宏的使用 ● 代码,使用结构,对比是否对齐的性能差距 1 INCLUDE Irvine32.inc 2 INCLUDE macros.inc 3 4 structN STRUCT ; 非对齐的结构 5 Lastname BYTE 30 DUP(0) ; 30 6 Years WORD 0 ; 2 7 SalaryHistory DWORD 0, 0, 0, 0 ; 16 8 structN ENDS ; 48 Byte 9 10 structA STRUCT

Java学习笔记—第九章 字符串String

第九章 字符串String Java中使用String类来创建一个字符串变量,字符串变量是类类型变量,是一个对象.声明字符串的语法格式如下:String s; 创建字符串:通过String类提供的构造方法可创建字符串,有以下几种方式: (1)创建字符串对象时直接赋值,例如: String s1 = "hello"; String s2 = new String("hello"); (2)由一个字符串创建另一个字符串,例如: String s1 = "hel

&lt;&lt;C++ Primer&gt;&gt; 第三章 字符串, 向量和数组 术语表

术语表 第 3 章 字符串, 向量和数组 begin: 是 string 和 vector 的成员,返回指向第一个元素的迭代器.也是一个标准库函数,输入一个数字,返回指向该数字首元素的指针. ?? 缓冲区溢出(buffer overflow): 一种严重的程序故障,主要的原因是试图通过一个越界的索引访问容器内容,容器类型包括 string,vector 和 数组等. ?? C 风格字符串(C-style string): 以空字符结束的字符数组.字符串字面值是 C 风格字符串,C风格字符串容易出

汇编语言:基于 X86 处理器第三章复习笔记

一:基本语言元素 1:整数常量 整数常量表达式:[{ + / - }] digits [ radix ] 整数常量的表达与进制是分不开的,通常通过在尾部添加字母加以区分: 十六进制 h 十进制   t(一般省略) 八进制   o/q 二进制   b 编码实数 r 注意:以字母开头的十六进制为了与标识符分区,必须在前面加数字 0 2:整形常量表达式 整形常量表达式是指一种算术表达式,由整数常量,算术运算符构成,注意:整形常量表达式的运算结果也必须是一个整数常量,其位数应该在处理器的位数之内 算术表

第三章字符串.向量和数组

练习3.24:请使用迭代器重做3.3.3节的最后一个练习(读入一组整数并把他们存入一个vector对象,先输出第一个和最后一个元素的和,接着输出第二个和倒数第二个元素的和,以此类推) #include<iostream> #include<vector> using namespace std; int main() { int a; vector<int> v; while(cin>>a) v.push_back(a); auto head = v.beg

js split 的用法和定义 js split分割字符串成数组的实例代码

<script language="javascript"> str="2,2,3,5,6,6"; //这是一字符串 var strs= new Array(); //定义一数组 strs=str.split(","); //字符分割 for (i=0;i<strs.length ;i++ ) { document.write(strs[i]+"<br/>"); //分割后的字符输出 } <

C和指针 (pointers on C)——第九章:字符串、字符和字节(上)

第九章字符串.字符和字节 这一块在初学的时候很容易被大家忽视,但字符串作为一种重要的数据类型,没有在C中显式的说明.这样看起来C++定义了string的数据类型实在是带来了不少福音. 如果想用C玩OJ或者数据结构与算法的话,这一章需要仔细阅读,因为这是你仅有能用到的字符串处理的标准库. 总结: C的字符串标准库使用需要声明"string.h". strlen用于计算一个字符串的长度,它的返回值是一个无符号的整数.后面会说可能存在的问题. strcpy函数把一个字符串从一个位置赋值到另一