▶ 书中第六章的程序,使用了条件判断和跳转来实现一些功能

● 代码,查找数组首个非零值

 INCLUDE Irvine32.inc

 .data
intArray SWORD , , , , , , , -, , , ; 测试用的数组
;intArray SWORD 1, 0, 0, 0
;intArray SWORD 0, 0, 0, 0
;intArray SWORD 0, 0, 0, 1
noneMsg BYTE "Non-zero value not found", .code
main PROC
mov ebx, OFFSET intArray
mov ecx, LENGTHOF intArray L1:
cmp WORD PTR [ebx], ; 与 0 作比较
jnz found ; 结果非零即找到了
add ebx, TYPE intArray
loop L1
jmp notFound found:
movsx eax, WORD PTR [ebx]
call WriteInt
jmp quit notFound:
mov edx, OFFSET noneMsg
call WriteString quit:
call crlf
call WaitMsg
main ENDP END main

● 代码,简单的加密 / 解密

 INCLUDE Irvine32.inc
KEY = ; 用来异或的秘钥
BUFMAX = .data
sPrompt BYTE "Plain text: ",
sEncrypt BYTE "Cipher text: ",
sDecrypt BYTE "Decrypted: ",
buffer BYTE BUFMAX + DUP()
bufSize DWORD ? .code
main PROC
call InputTheString ; 输入 call TranslateBuffer ; 加密并输出
mov edx, OFFSET sEncrypt
call DisplayMessage call TranslateBuffer ; 解密并输出
mov edx, OFFSET sDecrypt
call DisplayMessage call WaitMsg
exit
main ENDP InputTheString PROC
pushad ; 寄存器全压栈
mov edx, OFFSET sPrompt
call WriteString
mov ecx, BUFMAX
mov edx, OFFSET buffer
call ReadString
mov bufSize,eax
call Crlf
popad ; 寄存器全恢复,返回值在 buffer 里
ret
InputTheString ENDP DisplayMessage PROC
pushad
call WriteString
mov edx, OFFSET buffer
call WriteString
call Crlf
call Crlf
popad
ret
DisplayMessage ENDP TranslateBuffer PROC
pushad
mov ecx, bufSize
mov esi,
L1:
xor buffer[esi], KEY ; 用一个循环来逐字节异或
inc esi
loop L1 popad
ret
TranslateBuffer ENDP
END main

● 代码,表驱动选择

 INCLUDE Irvine32.inc
.data
CaseTable BYTE 'A' ; 驱动表,交替存储选项和分支
DWORD Process_A
BYTE 'B'
DWORD Process_B
BYTE 'C'
DWORD Process_C
BYTE 'D'
DWORD Process_D
NumberOfEntries = prompt BYTE "Input A, B, C or D: ",
msgA BYTE "Process_A",
msgB BYTE "Process_B",
msgC BYTE "Process_C",
msgD BYTE "Process_D", .code
main PROC
mov edx, OFFSET prompt ; 输入字符
call WriteString
call ReadChar
mov ebx, OFFSET CaseTable ; ebx 指向表
mov ecx, NumberOfEntries
L1:
cmp al, [ebx] ; 是否匹配 ebx 指向的项
jne L2 ; 否分支
call NEAR PTR [ebx + ] ; 是分支,调用对应的子过程(过程指针解引用,NEAR PTR)
call WriteString ; 显示相应的信息并退出循环
call Crlf
jmp L3 L2:
add ebx, ; 指向表中下一项
loop L1 L3:
exit call WaitMsg
main ENDP Process_A PROC
mov edx, OFFSET msgA
ret
Process_A ENDP Process_B PROC
mov edx, OFFSET msgB
ret
Process_B ENDP Process_C PROC
mov edx, OFFSET msgC
ret
Process_C ENDP Process_D PROC
mov edx, OFFSET msgD
ret
Process_D ENDP END main

● 代码,简单反汇编输出

 INCLUDE Irvine32.inc

 .data
TRUE =
FALSE =
gradeAverage WORD
credits WORD
OkToRegister BYTE ? .code
main PROC
mov OkToRegister,FALSE .IF gradeAverage >
mov OkToRegister,TRUE
.ELSEIF (gradeAverage > ) && (credits <= )
mov OkToRegister,TRUE
.ELSEIF (credits <= )
mov OkToRegister,TRUE
.ENDIF exit
main ENDP END main

■ 反汇编后,

 _main@0:
002E1005 jmp main (02E1010h)
002E100A int
002E100B int
002E100C int
002E100D int
002E100E int
002E100F int
--- D:\Code\assembler\project6\asm6\asm6\haha.asm ------------------------------ mov OkToRegister,FALSE
002E1010 mov byte ptr [OkToRegister (02E4004h)], .IF gradeAverage >
002E1017 cmp word ptr [gradeAverage (02E4000h)],15Eh
002E1020 jbe @C0001 (02E102Bh)
mov OkToRegister,TRUE
002E1022 mov byte ptr [OkToRegister (02E4004h)],
.ELSEIF (gradeAverage > ) && (credits <= )
002E1029 jmp @C0001+2Fh (02E105Ah)
@C0001:
002E102B cmp word ptr [gradeAverage (02E4000h)],0FAh
002E1034 jbe @C0001+1Eh (02E1049h)
002E1036 cmp word ptr [credits (02E4002h)],10h
002E103E ja @C0001+1Eh (02E1049h)
mov OkToRegister,TRUE
002E1040 mov byte ptr [OkToRegister (02E4004h)],
.ELSEIF (credits <= )
002E1047 jmp @C0001+2Fh (02E105Ah)
@C0004:
002E1049 cmp word ptr [credits (02E4002h)],0Ch
002E1051 ja @C0001+2Fh (02E105Ah)
mov OkToRegister,TRUE
002E1053 mov byte ptr [OkToRegister (02E4004h)],
.ENDIF exit
002E105A push
002E105C call _ExitProcess@4 (02E1075h)

● 代码,有限自动机判断输入的是否是一个合法的数字。注意每输入一个字符就进行状态跳转,而不是输入一行后回车才开始分析

 INCLUDE Irvine32.inc

 ENTER_KEY =               ; 回车键作为停止输入的标志
.data
InvalidInputMsg BYTE "Invalid input", , , .code
main PROC
call Clrscr StateA:
call Getnext ; 读取下一个字符
cmp al,'+' ; 前导 +,前往状态 B
je StateB
cmp al,'-' ; 前导 -,前往状态 B
je StateB
call IsDigit ; 数字,置 ZF = 1,前往状态 C
jz StateC
call DisplayErrorMsg ; 错误状态
jmp Quit StateB:
call Getnext
call IsDigit
jz StateC
call DisplayErrorMsg
jmp Quit StateC:
call Getnext
call IsDigit
jz StateC
cmp al, ENTER_KEY
je Quit
call DisplayErrorMsg
jmp Quit Quit:
call Crlf
call WaitMsg
exit
main ENDP Getnext PROC
call ReadChar
call WriteChar
ret
Getnext ENDP DisplayErrorMsg PROC
push edx
mov edx, OFFSET InvalidInputMsg
call WriteString
pop edx
ret
DisplayErrorMsg ENDP
END main

《汇编语言 基于x86处理器》第六章条件处理部分的代码的更多相关文章

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

    ▶ 书中第九章的程序,主要讲了字符串相关的输入.输出,以及冒泡排序.二分搜索 ● 代码,Irvine32 中的字符串库函数代码范例 INCLUDE Irvine32.inc .data str1 BY ...

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

    ▶ 书中第十三章的程序,主要讲了汇编语言和 C/++ 相互调用的方法 ● 代码,汇编中调用 C++ 函数 ; subr.asm INCLUDE Irvine32.inc askForInteger P ...

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

    ▶ 书中第十一章的程序,主要讲了 Windows 接口,在小黑框中进行程序交互 ● 在屏幕指定位置输出带自定义属性的文字 INCLUDE Irvine32.inc .data outHandle HA ...

  4. 《汇编语言 基于x86处理器》第十二章浮点数部分的代码

    ▶ 书中第十二章的程序,主要讲了 FPU 的指令和浮点数计算的过程 ● 代码,简单的 32 为浮点数测试 INCLUDE Irvine32.inc INCLUDE macros.inc .data f ...

  5. 《汇编语言 基于x86处理器》第七章整数运算部分的代码

    ▶ 书中第七章的程序,使用各种位移运算,加深了对内存.寄存器中整数类型变量存储的认识 ● 代码,双字数组右移 4 位 INCLUDE Irvine32.inc COUNT = ; 右移位数 .data ...

  6. 《汇编语言 基于x86处理器》前五章的小程序

    ▶ 书中前五章的几个小程序,基本的运算操作,使用了作者的库 Irvine32 和 Irvine64(一开始以为作者网站过期了,各网站上找到的文件大小都不一样,最后发现是要搭梯子 Orz,顺利下载).注 ...

  7. 《汇编语言 基于x86处理器》第十章 - 运行一个 16位实地址汇编程序

    ▶ 书上第 10 章,主要讲了宏,引用了一个 16 位实地址的程序,从代码开始到运行 ● 代码 ; main.asm INCLUDE Macros.inc IF IsDefined( RealMode ...

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

    ▶ 书中第十章的程序,主要讲了结构与宏的使用 ● 代码,使用结构,对比是否对齐的性能差距 INCLUDE Irvine32.inc INCLUDE macros.inc structN STRUCT ...

  9. 《汇编语言 基于x86处理器》第八章高级过程部分的代码 - 两种规范计算数组元素的和

    ▶ 输入 Count 个 32 位有符号整数,计算他们的和 ● 代码,使用堆栈传参 ;// Sum_main.asm,主过程 INCLUDE Irvine32.inc EXTERN PromptFor ...

随机推荐

  1. Requests+正则表达式爬取猫眼电影

    目标 提取出猫眼电影TOP100的电影名称.时间.评分.图片等信息,提取站点的URL为http://maoyan.com/board/4,提取的结果以文本的形式保存下来. 准备工作 请安装好reque ...

  2. 申请免费通配符证书(Let's Encrypt)并绑定IIS

    申请免费通配符证书(Let's Encrypt)并绑定IIS 2018-05-25 18:01 by Giant Liu, 800 阅读, 4 评论, 收藏, 编辑 什么是 Let’s Encrypt ...

  3. PyQt—QTableWidget中的checkBox状态判断

    一.QTableWidget实现checkBox效果 利用QTableWidgetItem对象的CheckState属性,既能显示QCheckBox,又能读取状态 table = QtGui.QTab ...

  4. eval方法将字符串转换成json对象

    方法一: 使用Eval将json字符串转为json对象 var str = "name:'Jon',sex:'男'"; 将字符串进行处理: str = "{"+ ...

  5. PHP7.1扩展开发入门

    第1步: 首先从官网下载了PHP源码http://am1.php.net/distributions/php-7.1.3.tar.bz2 第2步: 解压后可以看到根目录下面的ext文件夹里有ext_s ...

  6. MySQL · 引擎特性 · 基于InnoDB的物理复制实现(转载)

    http://mysql.taobao.org/monthly/2016/05/01/ 在开始之前,你需要对InnoDB的事务系统有个基本的认识.如果您不了解,可以参考我之前的几篇关于InnoDB的文 ...

  7. PowerDesigner最基础的使用方法入门学习(二)

    1.  生成sql脚本 Database→Generate Database 选择要输出的文件路径,即文件存储路径,并根据需要修改文件名,单击确定后便会生成sql脚本. 在Options选项卡里,可以 ...

  8. Jmeter(四十三)WebSocket Sampler 和 Ajax Request

     权利被放出牢笼,就很难再被关入笼中:奴性被唤出来,腰杆和膝盖很难再直起来. ----宅猪<牧神记> websocket: 参考:https://blog.csdn.net/minmint ...

  9. [UE4]如何编译部署独立专用服务端(Standalone Dedicated Server)

    这是论坛上对UE服务端功能的回答,意思是UE4提供了网游服务端所具备的特性,包括位移修正.物理碰撞检测.这些特性不是UE4才加入,早期UE版本就有了. https://answers.unrealen ...

  10. [UE4]客户端-服务器模式

    客户端负责表现.服务器端负责数据. 以掉血为例: 一.玩家A砍了B一刀 二.服务器计算伤害,修改B的血量 三.把B的血量发给B,A砍B的动作发给所有能看到的玩家 四.客户端播放掉血量(如果允许可见), ...