当前位置:首页 >> 其它课程 >>

32位汇编语言04


第4章 程序结构
4.1 顺序程序结构 4.2 分支程序结构 4.3 循环程序结构

第4章 程序结构
以顺序、分支和循环程序结构为主线 ? 结合数值运算、数组处理等示例程序 ? 掌握控制转移指令以及编写基本程序 的方法
?

4.1 顺序程序结构

? 按照指令书写的前后顺序执行每条指

令 ? 最基本的程序片段 ? 构成复杂程序的基础 ? 3个示例程序
? ? ?

知道“1+2+3+??+N”等于多少吗? 知道处理器内置的识别字符串是什么吗? 知道“01100100”代表什么吗?

第4章 程序结构

〔例4-1〕自然数求和程序
num sum ;数据段 dword 3456 ;假设一个N值(小于232-1) qword ? 1+2+??+N=(1+N)×N÷2 ;代码段 mov eax,num ;EAX=N add eax,1 ;EAX=N+1 imul num ;EDX.EAX=(1+N)×N shr edx,1 ;64位逻辑右移一位(除以2) rcr eax,1 ;EDX.EAX= EDX.EAX÷2 mov dword ptr sum,eax ;小端方式保存 mov dword ptr sum+4,edx
第4章 程序结构

〔例4-2〕处理器识别程序
;数据段 buffer byte 'The processor is',12 dup(0),0 bufsize = sizeof buffer GenuineIntel ;代码段 mov eax,0 cpuid ;执行处理器识别指令 mov dword ptr buffer+bufsize-13,ebx mov dword ptr buffer+bufsize-9,edx mov dword ptr buffer+bufsize-5,ecx mov eax,offset buffer ;显示信息 call dispmsg
第4章 程序结构

〔例4-3〕不同格式显示程序
mov al,var call dispbb call dispcrlf mov al,var call disphb call dispcrlf mov al,var call dispuib call dispcrlf mov al,var call dispc var byte 01100100b

二进制形式 十六进制形式 十进制形式 字符形式

运行结果
第4章 程序结构

4.2 分支程序结构

? 改变程序执行顺序、形成分支、循环、调用等程序
结构是很常见的程序设计问题 ? 高级语言采用 IF 等语句表达条件,并根据条件是否 成立转向不同的程序分支 ? 汇编语言需要 ? 首先利用比较CMP、测试TEST、加减 运算、逻辑运算等影响状态标志的 指令形成条件 ? 然后利用条件转移指令判断由标志 表达的条件,并根据标志状态控制程序 转移到不同的程序段
第4章 程序结构

4.2.1 无条件转移指令

? 程序代码在代码段
?

?

CS:指明代码段在主存中的段基地址 EIP:给出将要执行指令的偏移地址

? 程序顺序执行,处理器自动增量EIP ? 程序控制转移,EIP随之改变 ? 程序转移到另外的代码段,EIP和CS都改变 ? 控制转移类指令:改变 EIP(有些也改变CS),
即改变程序执行顺序(实现程序控制转移)的 指令
本章学习控制转移类指令
第4章 程序结构

1. 转移范围

? 段内转移
在当前代码段范围内的程序转移 ? 不需更改CS,只要改变EIP(偏移地址) ? 近转移(Near): 32位近转移NEAR32、16位近转移NEAR16 ? 短转移(Short):转移范围在127~-128字节 ? 段间转移 ? 从当前代码段跳转到另一个代码段 ? 需要更改CS(段地址)和EIP(偏移地址) ? 远转移(Far): 48位远转移FAR32、32位远转移FAR16
?
第4章 程序结构

2. 指令寻址方式

? 相对寻址方式
?

?
?

提供目标地址相对于当前指令指针EIP的位移量 目标地址(转移后的EIP)=当前EIP+位移量 相对寻址都是段内转移,最常用、最灵活

? 直接寻址方式
?
?

目标地址=目的地址=转移地址

直接提供目标地址 目标地址(转移后的CS和EIP)=指令操作数 指示寄存器或存储单元 目标地址来自寄存器或存储单元、间接获得 寄存器间接寻址:用寄存器保存目标地址 存储器间接寻址:用存储单元保存目标地址
第4章 程序结构

? 间接寻址方式
?
? ?

?

3. JMP指令

? 无条件转移:程序无条件改变执行顺序 ? JMP指令相当于高级语言的goto语句
JMP label ;程序转向label标号指定的地址 ;段内相对寻址,段间直接寻址 JMP reg32/reg16 ;程序转向寄存器指定的地址 ;寄存器间接寻址 JMP mem48/mem32/mem16 ;程序转向存储单元指定的地址 ;存储器间接寻址
第4章 程序结构

JMP指令的4种类型

1. 段内转移、相对寻址
?

标号指明目标地址,指令代码包含位移量 通用寄存器或主存单元包含目标指令偏移地址 标号包含目标指令的段地址和偏移地址 32位段用3字存储单元包含目标地址 16位段用双字存储单元包含目标地址
MASM会根据存储模式等信息自动识别
第4章 程序结构

2. 段内转移、间接寻址
?

3. 段间转移、直接寻址
?

4. 段间转移、间接寻址
? ?

〔例4-4〕无条件转移程序-1
00000000 00000000 00000002 00000003 labl1: 00000008 00000009 labl2: 0000000E ;数据段 00000000 nvar dword ? ;代码段 EB 01 jmp labl1 ;相对寻址 90 nop E9 00000001 jmp near ptr labl2 ;相对近转移 90 nop B8 00000011 R mov eax,offset labl3 FF E0 jmp eax ;寄存器间接寻址
第4章 程序结构

〔例4-4〕无条件转移程序-2
00000010 90 nop B8 00000022 R mov eax,offset labl4 A3 00000000 R mov nvar,eax 数据的存储器直接寻址 FF 25 00000000 R jmp nvar ; 存储器间接寻址 mov ebx,offset nvar 90 nop jmp near ptr [ebx] ;数据的寄存器间接寻址
第4章 程序结构

00000011 labl3: 00000016
0000001B 00000021

labl4:

4.2.2 条件转移指令

? 根据指定的条件确定程序是否发生转移
Jcc label
;条件满足,发生转移;否则,顺序执行下条指令

? LABEL表示目标地址,采用段内相对寻址
? ? ?

32位IA-32处理器:达到32位的全偏移量 16位80x86处理器:-128~+127间的短转移 条件转移指令不影响标志,但要利用标志
单个标志状态作为条件 两数大小关系作为条件
第4章 程序结构

? cc表示利用标志判断的条件,16种、两类
? ?
15

转移条件cc:单个标志状态
JZ/JE JNZ/JNE JS JNS JP/JPE JNP/JPO JO JNO JC JNC
16

ZF=1 ZF=0 SF=1 SF=0 PF=1 PF=0 OF=1 OF=0 CF=1 CF=0

Jump Jump Jump Jump Jump Jump Jump Jump Jump Jump

if if if if if if if if if if

Zero/Equal Not Zero/Not Equal Sign Not Sign Parity/Parity Even Not Parity/Parity Odd Overflow Not Overflow Carry Not Carry 多个助记符方便记忆
第4章 程序结构

转移条件cc:两数大小关系
JB/JNAE JNB/JAE JBE/JNA JNBE/JA JL/JNGE JNL/JGE CF=1 Jump if Below/Not Above or Equal CF=0 Jump if Not Below/Above or Equal CF=1或ZF=1 Jump if Below/Not Above CF=0且ZF=0 Jump if Not Below or Equal/Above SF≠OF Jump if Less/Not Greater or Equal SF=OF Jump if Not Less/Greater or Equal ZF≠OF或ZF=1 Jump if Less or Equal/Not Greater SF=OF且ZF=0 Jump if Not Less or Equal/Greater
第4章 程序结构

JLE/JNG
JNLE/JG

17

1. 单个标志状态作为条件的条件转移指令

? JZ(JE)和JNZ(JNE):利用零位标志ZF
?

判断结果是零(相等)还是非零(不等) 判断结果是负还是正 判断结果是溢出还是没有溢出 判断结果低字节“1”的个数是偶数还是奇数

? JS和JNS:利用符号标志SF
?

? JO和JNO:利用溢出标志OF
?

? JP(JPE)和JNP(JPO):利用奇偶标志PF
?

? JC和JNC:利用进位标志CF
?
18

判断结果是有进位(为1)还是无进位(为0)
第4章 程序结构

〔例4-5〕个数折半程序-1
mov eax,885 ;假设一个数据 shr eax,1 ;数据右移进行折半 jnc goeven ;余数为0,即CF=0条件成立,转移 add eax,1 ;否则余数为1,即CF=1,进行加1操作 goeven: call dispuid ;显示结果

443
运行结果
19

第4章 程序结构

〔例4-5〕个数折半程序-2
mov eax,886 ;假设一个数据 shr eax,1 ;数据右移进行折半 jc goodd ;余数为1,即CF=1条件成立,转移 jmp goeven ;余数为0,即CF=0无需处理,转移到显示! goodd: add eax,1 ;进行加1操作 goeven: call dispuid ;显示结果

jnc goeven
20

何不合二为一?
第4章 程序结构

〔例4-5〕个数折半程序-3
mov eax,887 ;假设一个数据 shr eax,1 ;数据右移进行折半 adc eax,0 ;余数=CF=1,进行加1操作 ;余数=CF=0,没有加1 消除分支 call dispuid ;显示结果 mov eax,888 add eax,1 rcr eax,1 call dispuid
21

;假设一个数据 改进算法 ;个数加1 ;数据右移进行折半 ;显示结果
第4章 程序结构

〔例4-6〕位测试程序-1
no_msg yes_msg ;数据段 byte 'Not Ready!',0 byte 'Ready to Go!',0 ;代码段 mov eax,56h ;假设一个数据 test eax,02h ;测试D1位(D1=1,其他位为0) jz nom ;D1=0条件成立,转移 mov eax,offset yes_msg ;D1=1,显示准备好 jmp done ;跳转过另一个分支体! mov eax,offset no_msg ;显示没准备好 call dispmsg

nom: done:

22

第4章 程序结构

〔例4-6〕位测试程序-2
no_msg yes_msg ;数据段 byte 'Not Ready!',0 byte 'Ready to Go!',0 ;代码段 mov eax,56h ;假设一个数据 test eax,02h ;测试D1位(D1=1,其他位为0) jnz yesm ;D1=1条件成立,转移 mov eax,offset no_msg ;D1=0,显示没准备好 jmp done ;跳转过另一个分支体! mov eax,offset yes_msg ;显示准备好 call dispmsg

yesm: done:

23

第4章 程序结构

〔例4-7〕奇校验程序
call readc ;键盘输入, AL=返回值 call dispcrlf ;回车换行(用于分隔) call dispbb ;以二进制形式显示数据 call dispcrlf ;回车换行(用于分隔) and al,7fh ;最高位置“0”、其他位不变 ;同时标志PF反映“1”的个数 jnp next ;个数为奇数,不需处理,转移 or al,80h ;个数为偶数,最高位置“1”、其他位不变 call dispbb ;显示含校验位的数据
第4章 程序结构

next:
24

2. 两数大小关系作为条件的条件转移指令

? 无符号数用高(Above)、低(Below)
?

?
? ?

低于(不高于等于):JB(JNAE)(CF=1) 不低于(高于等于):JNB(JAE)(CF=0) 低于等于(不高于):JBE(JNA)(CF=1或ZF=1) 不低于等于(高于):JNBE(JA)(CF=0且ZF=0) 小于(不大于等于):JL(JNGE)(SF≠OF) 不小于(大于等于):JNL(JGE)(SF=OF) 小于等于(不大于):JLE(JNG)(ZF≠OF或ZF=1) 不小于等于(大于):JNLE(JG)(SF=OF且ZF=0)
第4章 程序结构

? 有符号数用大(Greater)、小(Less)
?

?
? ?
25

〔例4-8〕数据比较程序-1
;数据段 in_msg1 byte 'Enter a number: ',0 in_msg2 byte 'Enter another number: ',0 out_msg1 byte 'Two numbers are equal: ',0 out_msg2 byte 'The less number is: ',0 out_msg3 byte 13,10,'The greater number is: ',0 ;代码段 mov eax,offset in_msg1 ;提示输入 call dispmsg call readsid ;输入第一个数据 mov ebx,eax ;保存到EBX mov eax,offset in_msg2 ;提示输入 call dispmsg call readsid ;输入第二个数据 mov ecx,eax ;保存到ECX
26

第4章 程序结构

〔例4-8〕数据比较程序-2 cmp ebx,ecx ;二个数据进行比较 jne nequal ;两数不相等,转移 mov eax,offset out_msg1 call dispmsg ;显示两数相等 mov eax,ebx call dispsid ;显示相等的数据 jmp done ;转移到结束 nequal: jl first ;EBX较小,不需要交换,转移 xchg ebx,ecx ;EBX保存较小数,ECX保存较大数
27

第4章 程序结构

〔例4-8〕数据比较程序-3
first: mov eax,offset out_msg2 ;显示较小数 call dispmsg mov eax,ebx ;较小数在EBX中 call dispsid mov eax,offset out_msg3 ;显示较大数 call dispmsg mov eax,ecx ;较大数在ECX中 call dispsid

done:
28

第4章 程序结构

4.2.3 单分支结构

? 只有一个分支的程序
?

类似高级语言的IF-THEN语句结构 当条件满足(成立),发生转移,跳过分支体 条件不满足,顺序向下执行分支体 IF语句是条件成立,执行分支体

? 注意采用正确的条件转移指令
? ?

? 条件转移指令与高级语言的IF语句正好相反
?

29

第4章 程序结构

〔例4-9〕求绝对值程序
;代码段 call readsid ;输入一个有符号数,从EAX返回值 cmp eax,0 ; 比较EAX与0 jge nonneg ;条件满足:EAX≥0,转移 neg eax ;条件不满足:EAX<0,为负数 ;需求补得正值 call dispuid ;分支结束,显示结果
示意图
30

nonneg:

第4章 程序结构

单分支结构的流程图

31

返回 第4章 程序结构

〔例4-10〕字母判断程序
call readc ;输入一个字符,从AL返回值 cmp al,'A’ ;与大写字母A比较 jb done ;比大写字母A小,不是大写字母,转移 cmp al,'Z’ ; 与大写字母Z比较 ja done ;比大写字母Z大,不是大写字母,转移 or al,20h ;转换为小写 call dispcrlf ;回车换行 call dispc ;显示小写字母

done:
32

第4章 程序结构

4.2.4 双分支结构

? 双分支程序结构有两个分支,条件为真执行一
个分支;条件为假,执行另一个分支
?

相当于高级语言的IF-THEN-ELSE语句

? 顺序执行的分支体1最后一定要有一条JMP指令
跳过分支体2
?

JMP指令必不可少,实现结束前一个分支回到共同 的出口作用 事先执行其中一个分支(选择出现概率较高的分 支)
第4章 程序结构

? 双分支结构有时可以改变为单分支结构
?
33

〔例4-11〕显示数据最高位程序-1
dvar ;数据段 dword 0bd630422h ;假设一个数据 ;代码段 双分支结构 mov ebx,dvar shl ebx,1 ;EBX最高位移入CF标志 jc one ;CF=1,即最高位为1,转移 mov al,'0' ;CF=0,即最高位为0:AL←'0' jmp two ;一定要跳过另一个分支 mov al,'1' ;AL←'1' call dispc ;显示
示意图
34

one: two:

第4章 程序结构

双分支结构的流程图

35

返回 第4章 程序结构

〔例4-11〕显示数据最高位程序-2
;代码段 单分支结构 mov ebx,dvar mov al,'0' ;假设最高位为0:AL←'0' shl ebx,1 ;EBX最高位移入CF标志 jnc two ;CF=0,即最高位为0,转移 mov al,'1' ;CF=1,即最高位为1,AL←'1' call dispc ;显示
第4章 程序结构

two:
36

〔例4-11〕显示数据最高位程序-3
;代码段 无分支结构 mov ebx,dvar mov al,'0' ;假设最高位为0:AL←‘0’(30H) shl ebx,1 ;EBX最高位移入CF标志 adc al,0 ;CF=0,即最高位为0,不加 ;CF=1,即最高位为1, ;加1后AL变为‘1’(31H) call dispc ;显示

two:

37

第4章 程序结构

〔例4-12〕有符号数运算溢出程序
dvar1 dvar2 dvar3 okmsg errmsg ;数据段 dword 1234567890 dword -999999999 dword ? byte 'Correct!',0 byte 'ERROR ! Overflow!',0 ; 代码段 mov eax,dvar1 sub eax,dvar2 jo error mov dvar3,eax mov eax,offset okmsg jmp disp mov eax,offset errmsg call dispmsg ;假设两个数据

;正确信息 ;错误信息

;求差 ;有溢出,转移 ;无溢出,保存差值 ;显示正确 ;显示错误
第4章 程序结构

error: disp:
38

4.2.5 多分支程序

? 实际问题存在多分支结构
分支处理中又有分支 ? 具有多个分支走向 ? 利用单分支和双分支这两个基本结构,可以解决程 序中多个分支结构的问题 ? 熟悉了汇编语言编程思想,还可以采用其他技巧性 的方法解决实际问题
?

使用表结构实现多分支

39

第4章 程序结构

〔例4-13〕地址表程序(1)-1
假设有10个信息串,根据输入选择显示不同的信息: 1)提示输入数字,并输入数字; 2)判断数字是否在规定的范围内,不在范围内重新输入; 3)显示数字对应的信息,退出。

;数据段 msg1 byte 'Chapter 1: Fundamentals',0dh,0ah,0 ?? ;10个信息 msg byte 'Input number(1~10): ',0dh,0ah,0 table dword disp1,disp2,disp3,disp4,disp5 dword disp6,disp7,disp8,disp9,disp10
40

第4章 程序结构

〔例4-13〕地址表程序(1)-2
;代码段 again: mov eax,offset msg call dispmsg ;提示输入 call readuid ;接收输入:EAX=数字 cmp eax,1 ;判断范围 jb again cmp eax,10 ja again ;不在范围内,重新输入 dec eax ;EAX=EAX-1 shl eax,2 ;EAX=EAX×4 jmp table[eax] ;多分支跳转
41

第4章 程序结构

〔例4-13〕地址表程序(1)-3
disp1: mov eax,offset jmp disp disp2: mov eax,offset jmp disp ?? disp9: mov eax,offset jmp disp disp10: mov eax,offset disp: call dispmsg msg1

msg2

msg9

msg10 ;显示

42

第4章 程序结构

〔例4-13〕地址表程序(2)
;数据段 ?? dword msg1,msg2,msg3,msg4,msg5 dword msg6,msg7,msg8,msg9,msg10 ;代码段 ?? dec eax ;EAX=EAX-1 shl eax,2 ;EAX=EAX×4 mov eax,table[eax] ;获得信息字符串地址 call dispmsg ;显示
第4章 程序结构

table

43

4.3 循环程序结构

? 三个部分组成:
循环初始——为开始循环准备必要的条件,如循 环次数、循环体需要的初始值等; ? 循环体——重复执行的程序代码,其中包括对循 环条件的修改等; ? 循环控制——判断循环条件是否成立,决定是否 继续循环 ? “先判断、后循环”的循环程序结构 ? 对应高级语言的WHILE语句 ? “先循环、后判断”的循环程序结构 ? 对应高级语言的DO语句 示意图
?
44

第4章 程序结构

循环程序结构的流程图

45

返回 第4章 程序结构

4.3.1 循环指令

LOOP label
;ECX←ECX-1;若ECX≠0,循环到LABEL DEC ECX ;否则,顺序执行 JNZ label

JECXZ label
;ECX=0,转移;否则顺序执行

CMP ECX,0 JZ label

? 目标地址采用相对短转移 ? 实地址存储模型使用CX作为计数器
46

第4章 程序结构

〔例4-14〕数组求和程序
mov ecx,lengthof array ;ECX=数组元素个数 循环初始 xor eax,eax ;求和初值为0 mov ebx,eax ;数组指针为0 again: add eax,array[ebx*(type array)] 循环体 ;求和 inc ebx ;指向下一个数组元素 循环控制 loop again mov sum,eax ;保存结果 call dispsid ;显示结果
47

第4章 程序结构

4.3.2 计数控制循环

? 通过次数控制循环
?

?

利用LOOP指令属于计数控制 常见是“先循环、后判断”循环结构

? 计数可以减量进行,即减到0结束 ? 计数可以增量进行,即达到规定值结束
循环程序结构的关键是如何控制循环

48

第4章 程序结构

〔例4-15〕求最大值程序-1
array count max ;数据段 dword -3,0,20,900,-56 = lengthof array ;数组的元素个数 dword ? ;存放最大值 ;代码段 mov ecx,count-1 ;元素个数减1是循环次数 mov esi,offset array mov eax,[esi] ;取出第一个元素给EAX,用于暂存最大值

49

第4章 程序结构

〔例4-15〕求最大值程序-2
again: add esi,4 cmp eax,[esi] ;与下一个数据比较 jge next ;已经是较大值,继续下一个循环比较 mov eax,[esi] ;EAX取得更大的数据 loop again ;计数循环 mov max,eax ;保存最大值

next:

50

第4章 程序结构

〔例4-16〕简单加密解密程序-1
key bufnum buffer msg1 msg2 msg3 ;数据段 byte 234 = 255 byte bufnum+1 dup(0) ;定义键盘输入需要的缓冲区 byte 'Enter messge: ',0 byte 'Encrypted message: ',0 byte 13,10,'Original messge: ',0 ;代码段 mov eax,offset msg1 ;提示输入字符串 call dispmsg mov eax,offset buffer ;设置入口参数EAX call readmsg ;调用输入字符串子程序 push eax ;字符个数保存进入堆栈
第4章 程序结构

51

〔例4-16〕简单加密解密程序-2
mov ecx,eax ;ECX=实际输入的字符个数,作为循环的次数 xor ebx,ebx ;EBX指向输入字符 mov al,key ;AL=加密关键字 encrypt: xor buffer[ebx],al ;异或加密 inc ebx dec ecx ;等同于:loop encrypt jnz encrypt ;处理下一个字符 mov eax,offset msg2 call dispmsg mov eax,offset buffer ;显示密文 call dispmsg
52

第4章 程序结构

〔例4-16〕简单加密解密程序-3
pop ecx ;从堆栈弹出字符个数,作为循环的次数 xor ebx,ebx ;EBX指向输入字符 mov al,key ;AL=解密关键字 decrypt: xor buffer[ebx],al ;异或解密 inc ebx dec ecx jnz decrypt ;处理下一个字符 mov eax,offset msg3 call dispmsg mov eax,offset buffer ;显示明文 call dispmsg
53

示意图 第4章 程序结构

简单加密解密程序运行实例

54

返回 第4章 程序结构

4.3.3 条件控制循环

? 根据条件决定是否进行循环
需要使用有条件转移指令实现 ? 多见“先判断、后循环”结构 ? 先行判断的条件控制循环程序 ? 很像双分支结构 ? 主要分支需要重复执行多次 (JMP的目标位置是循环开始) ? 另一个分支用于跳出这个循环 ? 先行循环的条件控制循环程序 ? 类似单分支结构,循环体就是分支体 ? 顺序执行就跳出循环
?
55

第4章 程序结构

〔例4-17〕字符个数统计程序
string ;数据段 byte ‘Do you have fun with Assembly?’,0 ;以0结尾的字符串 ;代码段 xor ebx,ebx ;EBX用于记录字符个数,也用于指向字符的指针 mov al,string[ebx] cmp al,0 ;用指令“test al,al”更好 jz done inc ebx ;个数加1 jmp again ;继续循环 mov eax,ebx ;显示个数 call dispuid
第4章 程序结构

again:

done:
56

〔例4-18〕斐波那契数列程序
mov eax,1 call dispuid call dispcrlf call dispuid call dispcrlf mov ebx,eax add eax,ebx jc done call dispuid call dispcrlf xchg eax,ebx jmp again ;EAX=F(1)=1 ;显示第1个数 ;回车换行 ;显示第2个数 ;回车换行 ;EBX=F(2)=1 ;EAX=F(N)=F(N-2)+F(N-1) ;显示一个数 ;回车换行 ;下次:EAX=F(N-2),EBX=F(N-1)

again:

done:
57

F(N)=F(N-1)+F(N-2)

N≥3
第4章 程序结构

4.3.4 多重循环

? 实际的应用问题
?

?
? ?

单纯的分支或循环结构 循环体中具有分支结构 分支体中采用循环结构 循环体中嵌套有循环,即形成多重循环结构

? 如果内外循环之间没有关系
比较容易处理 ? 如果需要传递参数或利用相同的数据 ? 问题比较复杂
?
58

第4章 程序结构

冒泡法的排序过程
比较遍数 数据 587 -632 777 234 1 -632 587 234 -34 2 -632 234 -34 587 3 -632 -34 234 587 4 -632 -34 234 587 从 小 到 大 排 序

-34

777

777

777

777

59

返回 第4章 程序结构

〔例4-19〕冒泡法排序程序
mov ecx,count ;ECX←数组元素个数 dec ecx ;元素个数减1为外循环次数 mov edx,ecx ;EDX←内循环次数 mov ebx,offset array mov eax,[ebx] ;取前一个元素 cmp eax,[ebx+1] ;与后一个元素比较 jng next ;前一个不大于后一个,不交换 xchg eax,[ebx+1] ;否则,进行交换 mov [ebx],eax inc ebx ;下一对元素 dec edx jnz inlp ;内循环尾 loop outlp ;外循环尾

outlp:
inlp:

next:

示意图

60

第4章 程序结构

〔例4-20〕字符剔除程序-1 mov esi,offset string outlp: cmp byte ptr [esi],0 ;外循环,先判断后循环 jz done ;为0结束 again: cmp byte ptr [esi],' ' ;是否是空格 jnz next ;不是空格继续循环 mov edi,esi ;是空格,剔除分支 inlp: inc edi ;该分支是循环程序 mov al,[edi] ;前移一个位置 mov [edi-1],al
61

第4章 程序结构

〔例4-20〕字符剔除程序-2
cmp byte ptr [edi],0 ;内循环,先循环后判断 jnz inlp ;内循环结束处 jmp again ;再次判断是否为空格(处理连续空格) inc esi ;继续对后续字符进行判断处理 jmp outlp ;外循环结束处

next:

done:

62

第4章 程序结构

第4章习题:程序结构
4.1 简答题(2、5、6、9、10) 4.2 判断题(2、4、6、7、10)

4.3 填空题(2、3、4、5、6)
4.4、4.7、4.15、4.17、4.27、4.29


相关文章:
汇编语言32位乘法
汇编语言32位乘法_工学_高等教育_教育专区。计算机汇编语言 32位乘法assume...文档贡献者 chenjiedevil 贡献于2012-04-13 专题推荐 2014教师资格材料分析辅....
Windows环境下32位汇编语言
Windows环境下32位汇编语言_IT/计算机_专业资料。个人学习Win32汇编语言的读书笔记,要点总结,非常有用,现在拿出来和大家分享!Windows 环境下 32 位汇编语言 程序设计...
习题答案 微机原理与接口_基于IA-32处理器和32位汇编语言_第四版
(7)MASM 汇编语言的注释用分号开始,但不能用中文分号。 (8)IA-32 处理器在...〔解答〕 41 42 43 0A 10 45 46 FF 00 04 04 04 FF 00 04 04 04 ...
微机原理与接口 基于IA-32处理器和32位汇编语言 第四版
(7)MASM 汇编语言的注释用分号开始,但不能用中文分号。 (8)IA-32 处理器在...〔解答〕 41 42 43 0A 10 45 46 FF 00 04 04 04 FF 00 04 04 04 ...
32位汇编语言程序设计 钱晓捷
32位汇编语言程序设计 钱晓捷_计算机软件及应用_IT/计算机_专业资料。本文档包含32位汇编语言程序设计重要习题及标准答案,这些习题都是考试重点,认真对大,多加练习,...
计算机组成原理与汇编语言03-04
计算机组成原理与汇编语言03-04_理学_高等教育_教育专区。华东交通大学 2003 —...3.在补码一位乘法中,如果判断位 YnYn+1=10,则下一步(但不是 最后一步) ...
32位汇编答案
32位汇编语言程序设计17稿... 804页 免费 32位汇编语言习题及答案(全... 115...(c) cmp eax,04fh je dest ; Y (d) cmp eax, 79 jne dest; N (e)...
郑州大学11级32位汇编语言程序设计A卷及答案
郑州大学11级32位汇编语言程序设计A卷及答案_工学_高等教育_教育专区。本文档包含郑州大学11级32位汇编语言程序设计A卷真题及答案,希望大家支持!...
汇编语言实现用16位乘法指令完成32位无符号数乘法
汇编语言实现用16位乘法指令完成32位无符号数乘法_IT/计算机_专业资料。微机接口课程设计,对对好用 《微型计算机原理与接口技术》 微型计算机原理与接口技术》实验...
微机原理接口与技术基于IA-32处理器和32位汇编语言
微机原理接口与技术基于IA-32处理器和32位汇编语言_计算机硬件及网络_IT/计算机...3.12〔解答〕 41 42 43 0A 10 45 46 FF 00 04 04 04 FF 00 04 04...
更多相关标签:
32位汇编语言程序设计 | 32位汇编语言 | 32位汇编语言视频教程 | 汇编语言32位加法 | windows 32位汇编语言 | 32位汇编 | 32位汇编指令 | 汇编32位除法 |