《汇编语言 基于x86处理器》第六章条件处理部分的代码
▶ 书中第六章的程序,使用了条件判断和跳转来实现一些功能
● 代码,查找数组首个非零值
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处理器》第六章条件处理部分的代码的更多相关文章
- 《汇编语言 基于x86处理器》第九章字符串与数组部分的代码
▶ 书中第九章的程序,主要讲了字符串相关的输入.输出,以及冒泡排序.二分搜索 ● 代码,Irvine32 中的字符串库函数代码范例 INCLUDE Irvine32.inc .data str1 BY ...
- 《汇编语言 基于x86处理器》第十三章高级语言接口部分的代码 part 2
▶ 书中第十三章的程序,主要讲了汇编语言和 C/++ 相互调用的方法 ● 代码,汇编中调用 C++ 函数 ; subr.asm INCLUDE Irvine32.inc askForInteger P ...
- 《汇编语言 基于x86处理器》第十一章 MS-DOS 编程部分的代码 part 2
▶ 书中第十一章的程序,主要讲了 Windows 接口,在小黑框中进行程序交互 ● 在屏幕指定位置输出带自定义属性的文字 INCLUDE Irvine32.inc .data outHandle HA ...
- 《汇编语言 基于x86处理器》第十二章浮点数部分的代码
▶ 书中第十二章的程序,主要讲了 FPU 的指令和浮点数计算的过程 ● 代码,简单的 32 为浮点数测试 INCLUDE Irvine32.inc INCLUDE macros.inc .data f ...
- 《汇编语言 基于x86处理器》第七章整数运算部分的代码
▶ 书中第七章的程序,使用各种位移运算,加深了对内存.寄存器中整数类型变量存储的认识 ● 代码,双字数组右移 4 位 INCLUDE Irvine32.inc COUNT = ; 右移位数 .data ...
- 《汇编语言 基于x86处理器》前五章的小程序
▶ 书中前五章的几个小程序,基本的运算操作,使用了作者的库 Irvine32 和 Irvine64(一开始以为作者网站过期了,各网站上找到的文件大小都不一样,最后发现是要搭梯子 Orz,顺利下载).注 ...
- 《汇编语言 基于x86处理器》第十章 - 运行一个 16位实地址汇编程序
▶ 书上第 10 章,主要讲了宏,引用了一个 16 位实地址的程序,从代码开始到运行 ● 代码 ; main.asm INCLUDE Macros.inc IF IsDefined( RealMode ...
- 《汇编语言 基于x86处理器》第十章结构和宏部分的代码
▶ 书中第十章的程序,主要讲了结构与宏的使用 ● 代码,使用结构,对比是否对齐的性能差距 INCLUDE Irvine32.inc INCLUDE macros.inc structN STRUCT ...
- 《汇编语言 基于x86处理器》第八章高级过程部分的代码 - 两种规范计算数组元素的和
▶ 输入 Count 个 32 位有符号整数,计算他们的和 ● 代码,使用堆栈传参 ;// Sum_main.asm,主过程 INCLUDE Irvine32.inc EXTERN PromptFor ...
随机推荐
- linux开机出现一下错误Give root password for maintenance (or type Control-D to continue):
由于错误的编辑/etc/fstab文件 而引起的不能正常进入系统.假如你将某一个分区或者磁盘最后一个参数设置为1或2时,系统默认会在开机过程中检查这个磁盘的扇区.假如系统检查不到这个磁盘,或者这个磁盘 ...
- webstorm 破解码
https://blog.csdn.net/voke_/article/details/76418116 摘自此博客
- git log乱码显示
1.Linux下UTF8编码 [xusi@pre-srv24 crm2]$ localeLANG=en_US.UTF-8 设置如下: git config --global i18n.commiten ...
- win10 专业版 git bash 闪退问题终极解决方案
问题描述 Win10 64位专业版安装git 2.x之后出现 Git闪退,安装1.x出现bash: /dev/null: No such device or address fatal: open / ...
- [UE4]Text Block文字字体偏移
这样看起来就像是真正的垂直居中对齐了.
- failed to launch: nice -n 0 /home/hadoop/spark-2.3.3-bin-hadoop2.7/bin/spark-class org.apache.spark.deploy.worker.Worker --webui-port 8081 spark://namenode1:7077
spark2.3.3安装完成之后启动报错: [hadoop@namenode1 sbin]$ ./start-all.shstarting org.apache.spark.deploy.master ...
- C# 知识特性 Attribute,XMLSerialize,
C#知识--获取特性 Attribute 特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联.特性与程序实体关联后,可在运行时使用“反射”查询特性,获取特性集合方 ...
- 递归&栈帧空间
递归函数: 自己调用自己的函数 def digui(n): print(n) if n > 0: digui(n-1) print(n) digui(5) 执行结果: 5 4 3 2 1 0 0 ...
- HBase配置性能调优
因官方Book Performance Tuning部分章节没有按配置项进行索引,不能达到快速查阅的效果.所以我以配置项驱动,重新整理了原文,并补充一些自己的理解,如有错误,欢迎指正. 配置优化 zo ...
- javaweb项目中遇到的一些乱码问题
在做javaweb项目时,我们经常会遇到一些乱码问题: 首先,确定一点思想:要想不乱码,你要保证编码一致就行了,即统一编码~ 其一,jsp等页面中的中文显示乱码(这里不只是说jsp文件,其它文件也有这 ...