1612_PC汇编语言_条件以及控制结构

news2024/11/19 16:43:46

         全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)

         这一次简单看看条件分支以及控制结构,感觉看完这部分之后,汇编的大部分框架已经有个差不多了。我的目的并不是成为汇编高手,因此剩下的部分直接快进即可了。

         这是提供的几种跳转分支,类似GOTO,只是这个GOTO是带条件的。其实这些我并不陌生,大学时候的记忆还在。

         上面的例子展示了一个比较简单的例子,条件赋值。其实,跟着指令走还是很容易理解机器的行为意图的。但是如果看完之后,想要翻译成一个高级语言可能并不是那么容易。第二个例子,其实是展示了一点“图灵完备”的意思了,纵然不好用但是也可以解决问题。然而,CPU其实有更好的设计。

         这就是前面所谓的更好的设计了,算是进行了很多情况的复杂细分应对。而下面的这个例程实现则是简单的多了。

         这里给出来了一个循环的例子,只是这个循环让人有点觉得不舒服。因为需要转换一下表达的思路,才能够把加法处理改成减法处理。接下来,给了一个实现条件分支的汇编模板。

         这里的两种循环结构,理解也是很容易的。其实,只需要结合C语言加入一个语素就能够理解,那就是把跳转转换成break或者continue。

         这一段代码在开始附加了一段C语言实现,由此再进行相关的汇编实现只是一个翻译工作了。从这种思考角度来进行软件设计也是一个思考的方式。

         我最初做这个代码分析的时候并没有看原始的C代码,也没有注意到里面写了前两个作为特殊的对象处理。当时看到这里觉得这个程序有问题,因为无论截止数值是多少前两个数都会输出。测试结果自然也是如此,但是这个是这个程序本身想处理的。

         剩余的部分解析也很容易。不过,这种设计也不过是拿来辅助一下对于汇编这个工具的使用。类似这样的软件设计自然还是直接高级语言处理来的更加现实一些。

         顺利编译,makefile还是需要修改的。以下是运行的结果:

         最后,附加增补了注释的源代码如下:

;

; file: prime.asm

; This program calculates prime numbers

;

; To create executable:

; nasm -f coff prime.asm

; gcc -o prime prime.o driver.c asm_io.o

;

; Works like the following C program:

; #include <stdio.h>

;

;int main()

;{

;  unsigned guess;          /* current guess for prime      */

;  unsigned factor;         /* possible factor of guess     */

;  unsigned limit;          /* find primes up to this value */

;

;  printf("Find primes up to: ");

;  scanf("%u", &limit);

;

;  printf("2\n");    /* treat first two primes as special case */

;  printf("3\n");

;

;  guess = 5;        /* initial guess */

;  while ( guess <= limit ) {

;    /* look for a factor of guess */

;    factor = 3;

;    while ( factor*factor < guess && guess % factor != 0 )

;      factor += 2;

;    if ( guess % factor != 0 )

;      printf("%d\n", guess);

;    guess += 2;    /* only look at odd numbers */

;  }

;  return 0;

;}

;

%include "asm_io.inc"

segment .data

Message         db      "Find primes up to: ", 0

segment .bss

Limit           resd    1               ; find primes up to this limit

Guess           resd    1               ; the current guess for prime


 

segment .text

        global  asm_main

asm_main:

        enter   0,0               ; setup routine

        pusha

        mov     eax,  Message

        call    print_string

        call    read_int             ; scanf("%u", & limit );

        mov     [Limit], eax

        ; 从这里看,其实23是一直会输出的,因此这个程序应该会有bug

        mov     eax, 2               ; printf("2\n");

        call    print_int

        call    print_nl

        mov     eax, 3               ; printf("3\n");

        call    print_int

        call    print_nl

        mov     dword [Guess], 5     ; Guess = 5;

        ;; 从第三个质数开始猜测,如果这个就已经大于了限制数值那么直接结束即可

while_limit:                         ; while ( Guess <= Limit )

        mov     eax,[Guess]

        cmp     eax, [Limit]

        jnbe    end_while_limit      ; use jnbe since numbers are unsigned

        mov     ebx, 3               ; ebx is factor = 3;

        ;; 查看是否还有其他的因子

while_factor:

        mov     eax,ebx

        mul     eax                  ; edx:eax = eax*eax

        ;; 这个应该是已经超出了处理极限了,因此直接结束

        jo      end_while_factor     ; if answer won't fit in eax alone

        ;; 如果还在处理的范围内,看看猜测的因子乘积是否大于猜测值

        cmp     eax, [Guess]

  ;; 如果因子的平方大于等于猜测值,直接结束因子测试

  ;; 否则看看是否整除,如果整除结束

        jnb     end_while_factor     ; if !(factor*factor < guess)

        mov     eax,[Guess]

        mov     edx,0

        div     ebx                  ; edx = edx:eax % ebx

        cmp     edx, 0

        je      end_while_factor     ; if !(guess % factor != 0)

        add     ebx,2                ; factor += 2;

        jmp     while_factor

end_while_factor:

  ;; 如果测试完了所有的因子不整除,那么是质数

        je      end_if               ; if !(guess % factor != 0)

        mov     eax,[Guess]          ; printf("%u\n")

        call    print_int

        call    print_nl

end_if:

        mov     eax,[Guess]

        add     eax, 2

        mov     [Guess], eax         ; guess += 2

        jmp     while_limit

end_while_limit:

        popa

        mov     eax, 0            ; return back to C

        leave

        ret

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据处理——增删改

文章目录插入数据方式一&#xff1a;values方式2&#xff1a;将查询结果插入到表中更新数据删除数据MySQL8新特性&#xff1a;计算列综合案例插入数据 用INSERT插入数据 方式一&#xff1a;values 使用这种语法一次只能向表中插入一条数据。 情况1&#xff1a;为表的所有字段…

1月,不要跳槽

新年结束了&#xff0c;一些不满现状&#xff0c;被外界的“高薪”“好福利”吸引的人&#xff0c;一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的软件…

通信原理笔记—码间串扰与波形传输无失真的条件(奈奎斯特第一准则)

目录 波形传输的无失真条件&#xff1a; 码间串扰问题&#xff1a; 奈奎斯特第一准则&#xff1a; 在抽样判决时刻没有码间串扰的信号波形示例&#xff1a; 具有最窄频带的无码间串扰基带传输系统&#xff1a; 无码间串扰基带系统的主要参数&#xff1a; 一种典型的滚降…

golang中的图像image处理详解

常用的图像格式有png&#xff0c;jpeg&#xff0c;gif&#xff0c;对应的文件后缀为png&#xff0c;jpg&#xff0c;gif&#xff0c;当然文件的具体内容编码才能证明存放的是哪种文件&#xff0c;图像文件的头部都存储了具体标志&#xff0c;比如jpeg前缀\xffd8&#xff0c;png…

Redis实现消息队列

7、Redis消息队列 7.1 Redis消息队列-认识消息队列 什么是消息队列&#xff1a;字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色&#xff1a; 消息队列&#xff1a;存储和管理消息&#xff0c;也被称为消息代理&#xff08;Message Broker&#xff09;生产者&…

定位tcp连接或端口是属于哪个进程

首先要知道tcp连接的端口号&#xff0c;要么是本地端口号要是么remote端口号。有的端口号我们已知&#xff0c;有的端口号可以通过日志获取&#xff0c;也可以抓包获取&#xff0c;如然后是用netstat命令获取pidlinux下使用netstat -anpt&#xff08;a是输出所有n是展示端口号&…

【✓基础算法 2.4】KMP(完结)

当模式串和主串的子串有不匹配时&#xff0c;便往后退一步&#xff0c;看是否能走通&#xff0c;如果不能&#xff0c;则进行退—— KMP 目录 一、KMP算法简介 二、手算求next数组 三、next数组实现代码 四、完整代码实现 1、java 2、c 一、KMP算法简介 当主串的子串…

软件测试刚入职,很茫然怎么办~

毕业后能直接到公司开始工作&#xff0c;是多少人都想要却得不到的机遇&#xff0c;你现在茫然无非是因为对软件测试是做什么的不了解&#xff0c;也不知道软件测试的职业规划到底是怎么样的~ 既然已经进入了公司&#xff0c;那就要珍惜机会&#xff0c;多学习&#xff0c;多问…

redis7 Cluster模式 集群

1.Redis集群模式介绍 Cluster模式是Redis3.0开始推出的Redis Cluster属于AP模型采用无中心结构&#xff0c;每个节点保存数据和整个集群状态, 每个节点都和其他所有节点连接官方要求&#xff1a;至少6个节点才可以保证高可用&#xff0c;即3主3从&#xff1b;扩展性强、更好做到…

[GUET-CTF2019]re

于尘世中携一支笔&#xff0c;绘春风十里。 1.查壳 64bit加了UPX壳 2.使用Kali Linux脱壳 re脱壳3.静态分析 shift加F12打开string窗口 发现可疑字符&#xff0c;点击跟进 光标放在aCorrect&#xff0c;点击快捷键X查看引用这个字符串的地方 点击跟进 按下F5反编译 将函数重命…

为什么AI爆炸式增长会对元宇宙产生巨大影响

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;9分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 想想你梦想中的房子。也许它有高高的拱形天花板、温暖的壁炉和宽阔的窗户&…

Allegro如何打开丝印位号的飞线操作指导

Allegro如何打开丝印位号的飞线操作指导 用Allegro做PCB设计的时候,移动器件的位号,会有根飞线实时提示位号是属于哪个器件的,如下图 但是只有在临时移动丝印位号的时候才会显示飞线,如何让所有的器件位号的全部显示,具体操作如下 选择Setup选择User Preferences

如何通过Zabbix Docker配置HTTPS访问系统?

概述 前面文章曾介绍过如果使用docker-compose快速部署一个Zabbix系统&#xff0c;但是部署的Zabbix系统是使用http协议进行访问的。有时候为了保证安全。我们需要配置使用https协议进行访问。 下面就讲述如何使用自签名的ssl证书配置https访问。&#xff08;注&#xff1a;若是…

开发者对抗软件创新焦虑的“180 法则” | 对话MongoDB CTO Mark Porter

在 MongoDB 首席技术官 Mark Porter 看来&#xff0c;创新滞后并不是因为公司缺乏灵感或创造力&#xff0c;而是因为他们被迫将时间花费在维护传统框架上&#xff0c;导致数据相关工作举步维艰&#xff0c;这是大多数组织都存在的问题。那么&#xff0c;对于企业而言&#xff0…

千姿百态,瞬息万变,Win11系统NeoVim打造全能/全栈编辑器(前端/Css/Js/Vue/Golang/Ruby/ChatGpt)

我曾经多次向人推荐Vim&#xff0c;其热情程度有些类似现在卖保险的&#xff0c;有的时候&#xff0c;人们会因为一些弥足珍贵的美好暗暗渴望一个巨大的负面&#xff0c;比如因为想重温手动挡的快乐而渴望买下一辆二十万公里的老爷车&#xff0c;比如因为所谓完美的音质而舍不得…

xxl-sso知识点

1、哈希环算法&#xff1a; 通过将数据分配到一个环形的哈希表上来实现数据的分布&#xff0c;根据环上的顺序依次进行分配。 对于数据敏感的服务不能用取余hash来实现&#xff0c;当新增节点时之前按照取余hash放的数据在新增节点之后在相应的节点找不到数据&#xff0c;而哈…

“华为杯”研究生数学建模竞赛2005年-【华为杯】B题:空中加油

赛题描述 对飞行中的飞机进行空中加油,可以大大提高飞机的直航能力。为了简化问题,便于讨论,我们作如下假设。 少辅机架数两种情况给出你的作战方案。 解题思路 摘要: 本文讨论了在辅机只能一次起飞和可以多次起飞情况下,辅机数量与主机 最大作战半径的关系,给出了只…

【前端工程化】一.前端工程化;二.使用webpack打包vue项目;三.在webstorm中安装vite插件,通过vite构建工具创建vue项目

目录 一.前端工程化 1.webpack &#xff08;1&#xff09;定义&#xff1a;是一个前端的构建工具。前端代码格式多&#xff08;html、css、js、图片&#xff09;&#xff0c;前端构建工具的作用是将各种格式不同文件打包到一起&#xff0c;方便项目的上线运行。&#xff08;将…

60 k8s集群中container监控指标有label但是没有value

k8s集群中container监控指标有label但是没有value 1、现象 无法获取到以下label的值:container, image, pod, name 集群刚搭建完的时候一切都是正常的,后来运行一段时间后就缺这缺那的。 2、原因排查 由于这些指标是kubelet上报的,因此看了对应节点上kubelet的日志,发现…

从事Java开发学历是门槛吗?

“学历低&#xff0c;工作好找吗&#xff0c;以后跳槽、转型会不会有门槛&#xff1f;”是的&#xff0c;学历这块敲门砖&#xff0c;在哪里都适用。工厂流水线里学历高的更容易被提拔为管理者&#xff0c;学历越高&#xff0c;对于工具的使用越好。门槛越高&#xff0c;薪资待…