《汇编语言程序设计》例子之查找最大数

2024-06-18 05:28

本文主要是介绍《汇编语言程序设计》例子之查找最大数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        以下是第5章中讲到的 CMOV 的指令的例子,原来的源码是这样的:

# cmovtest.s - An example of the CMOV instructions
.section .data
output:.asciz "The largest value is %d\n"
values:.int 105, 235, 61, 315, 134, 221, 53, 145, 117, 5
.section .text
.globl _start
_start:nopmovl values, %ebxmovl $1, %edi
loop:movl values(, %edi, 4), %eaxcmp %ebx, %eaxcmova %eax, %ebxinc %edicmp $10, %edijne looppushl %ebxpushl $outputcall printfaddl $8, %esppushl $0call exit

当前使用环境为 Linux cnhz-cmpl42 4.15.0-197-generic #208-Ubuntu SMP Tue Nov 1 17:23:37 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux,这个程序是没法运行的。所以修改成如下:

# cmovtest.s - An example of the CMOV instructions
.section .data
output:.asciz "The largest value is %d\n"
values:.int 105, 235, 61, 315, 134, 21, 53, 145, 1117, 50
temp:.quad 0		#用于存放最大的那个数,因为这个参数是要加载到 rsi 寄存器的,如果用直接用原来的 ebx,则在 movl %ebx, %rsi 无法编译过,即使用 movq 也不行,#所以用一个临时变量存放
.section .text
.globl main
main:nopmovl $temp, %ecx		#将 temp的地址加载到 ecx 寄存器movl values, %ebxmovl $1, %edi
loop:movl values(, %edi, 4), %eaxcmp %ebx, %eaxcmova %eax, %ebxmovl %ebx, (%ecx)	#将最大值存放到 ecx 寄存器中地址所指的位置inc %edicmp $10, %edijne loopmovq $output, %rdimovq temp, %rsimovq $0, %raxcall printfret

Makefile:

CC = gcc
CFLAGS = -g -no-pie
SRCS = $(shell ls -t | grep "\.s$$" | head -1)a.out: $(SRCS)$(CC) -o $@ $(SRCS) $(CFLAGS).PHONY: clean
clean:rm -rf a.out

 

修改点:

1,修改入口点为 main,因为我直接用的 gcc 编译,Makefile 如上所示。

2,参数传送方式不一样了,movq $output, %rdi 和 movq temp, %rsi 传递第1、2 个参数,但在传递第2个参数时,如果直接用 movq %ecx, %rsi 会出现编译错误,这是两个不一样长度的寄存器,刚学我也不知道该如何正确使用,所以添加了一个临时变量来存放最大数,然后再从这个临时变量加载到 %rsi 寄存器中以达到目的。

以下还有另外一种写法,用的都是64位寄存器的名称,即全部使用以 r_ 开头的寄存器:

#cmov_test.s  -- An example of the CMOV instructions
.section .data
output:.string "The largest value is %d\n"
value: # 定义成 quad,即元素大小为 8 字节,所以下面的 value(,%rdi,8) 这里为 8.quad 15, 24, 61, 36, 134, 221, 63, 145, 117, 59.section .text
.global main
main:nopmovq value, %rbx	# 将 value 的第一个元素加载到 rbx 寄存器movq $1, %rdi		# 将立即数 1 加载到 rdi 寄存器
loop:movq value(, %rdi, 8), %rax		# 将偏移 value (%edi * 8) 个字节位置的值加载到 rax 寄存器,即第2、3、4、5、... 个元素cmp %rbx, %rax					# 比较两个寄存器里值的大小cmova %rax, %rbx				# 如果rax 里的值大于 rbx 里的值,则将 rax 里的值加载到 rbxinc %rdi						# 自增加 1cmp $10, %rdi					# 比较 rdi 里的值和立即数10,类似检查数组下标jne loop						# jump not equal -- 假如不等于则跳转到 loop 标签movq $output, %rdimovq %rbx, %rsimovq $0, %raxcall printfret

这篇关于《汇编语言程序设计》例子之查找最大数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071419

相关文章

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i