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

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

 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. 错误 Run-time error nnn at xxxx; 错误

      出现runtime error临时解决办法,于注册表位置中找到如下键值HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Gdiplus,然后把键DisableTIFFCo ...

  2. Hiero中versionscanner模块结构图

    花了两周读这个模块,终于把结构理清楚了,当然新功能也搞定了,搜索条件更宽松,可以找到binitem对象中更多的版本,截图如下: 当然功能也做出来啦: 代码如下: ################### ...

  3. Windows Azure Web Site (18) Azure Web App设置MIME

    <Windows Azure Platform 系列文章目录> 在笔者之前的文章中,介绍了我们在使用Azure Web App,可以把静态资源保存到Azure Storage中: Wind ...

  4. eclipse 修改 项目的git地址

    在项目的隐藏目录.git 文件夹下面 修改config配置文件 [core] symlinks = false repositoryformatversion = 0 filemode = false ...

  5. C++11--智能指针shared_ptr,weak_ptr,unique_ptr <memory>

    共享指针 shared_ptr /*********** Shared_ptr ***********/ // 为什么要使用智能指针,直接使用裸指针经常会出现以下情况 // 1. 当指针的生命长于所指 ...

  6. Mina - 模拟同步请求

    这篇博客主要就铺代码吧,Mina的一些基础知识可以参考: http://www.cnblogs.com/huangfox/p/3458272.html 场景假设: 1.客户端发送用户信息,服务端根据用 ...

  7. asp.net控件拖不动。控件错误

    有一种可能是工程的存储路径名称不规范导致,更改命名空间及路径. 我的存储路径是C#文件夹下,去掉#完美解决

  8. 【原创】Docker实战 Dockerfile最佳实践&&容器之间通信

    官方最佳实践文档 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#from Docker实战(三十) ...

  9. ros6.44版本增加了测试出两台ROS之间的速度极限是多少

    原文: https://wiki.mikrotik.com/wiki/Manual:Tools/Speed_Test [admin@MikroTik]] > /tool speed-test a ...

  10. 知识点:java 注解 @SuppressWarnings

    前言: 简介:java.lang.SuppressWarnings是J2SE5.0中标准的Annotation之一.可以标注在类.字段.方法.参数.构造方法,以及局部变量上.作用:告诉编译器忽略指定的 ...