C语言的类型转换

C语言的类型转换很重要,经常出现,但是往往不被人注意,而在汇编代码当中就暴露无遗了。

如下列代码:

char ch; 

while ((ch = getchar()) != '#')
        putchar(ch);

反汇编后:

.text:00401006                 mov     eax, stru_407030._cnt
.text:0040100B                 sub     eax, 1
.text:0040100E                 mov     stru_407030._cnt, eax
.text:00401013                 cmp     stru_407030._cnt, 0
.text:0040101A                 jl      short loc_40103D
.text:0040101C                 mov     ecx, stru_407030._ptr
.text:00401022                 movsx   edx, byte ptr [ecx]
.text:00401025                 and     edx, 0FFh
.text:0040102B                 mov     [ebp+var_8], edx
.text:0040102E                 mov     eax, stru_407030._ptr
.text:00401033                 add     eax, 1
.text:00401036                 mov     stru_407030._ptr, eax
.text:0040103B                 jmp     short loc_40104D
.text:0040103D ; ---------------------------------------------------------------------------
.text:0040103D
.text:0040103D loc_40103D:                             ; CODE XREF: _main+1Aj
.text:0040103D                 push    offset stru_407030 ; File
.text:00401042                 call    __filbuf
.text:00401047                 add     esp, 4
.text:0040104A                 mov     [ebp+var_8], eax ; 这里是重点 注意getchar()的返回类型是int,要赋给char需要类型转换

;以上都是getchar()的汇编代码,在很多实现中,getchar()只是一个macro,所以才会展开这么多代码

.text:0040104D
.text:0040104D loc_40104D:                             ; CODE XREF: _main+3Bj
.text:0040104D                 mov     cl, byte ptr [ebp+var_8] 
.text:00401050                 mov     [ebp+var_4], cl
.text:00401053                 movsx   edx, [ebp+var_4] ;同样,0x23h是int类型,和它比较也要做转换,所以要用带符号扩展的movsx
.text:00401057                 cmp     edx, 23h
.text:0040105A                 jz      short loc_4010B4 ;以下是putchar()的代码

.text:0040105C                 mov     eax, File._cnt
.text:00401061                 sub     eax, 1
.text:00401064                 mov     File._cnt, eax
.text:00401069                 cmp     File._cnt, 0
.text:00401070                 jl      short loc_40109A
.text:00401072                 mov     ecx, File._ptr
.text:00401078                 mov     dl, [ebp+var_4]
.text:0040107B                 mov     [ecx], dl
.text:0040107D                 movsx   eax, [ebp+var_4]
.text:00401081                 and     eax, 0FFh
.text:00401086                 mov     [ebp+var_C], eax
.text:00401089                 mov     ecx, File._ptr
.text:0040108F                 add     ecx, 1
.text:00401092                 mov     File._ptr, ecx
.text:00401098                 jmp     short loc_4010AF
.text:0040109A ; ---------------------------------------------------------------------------
.text:0040109A
.text:0040109A loc_40109A:                             ; CODE XREF: _main+70j
.text:0040109A                 push    offset File     ; File
.text:0040109F                 movsx   edx, [ebp+var_4]
.text:004010A3                 push    edx             ; Ch
.text:004010A4                 call    __flsbuf
.text:004010A9                 add     esp, 8
.text:004010AC                 mov     [ebp+var_C], eax
.text:004010AF
.text:004010AF loc_4010AF:                             ; CODE XREF: _main+98j
.text:004010AF                 jmp     loc_401006

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

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

相关文章

【文心一言】学习笔记

学习资料 《听说文心一言App霸榜了,那必须来一波全方位实测了》 情感陪伴:文心一言 App 可以充当用户的情感树洞,提供知心姐姐、【暖男】等角色扮演,为用户提供情绪疏导、情感分析、约会建议等服务。 1. 模型属性 【提示词工具…

cobbler自动化安装CentOS、windows和ubuntu

环境介绍 同时玩cobbler3.3和cobbler2.8.5 cobbler3.3 系统CentOS8.3 VMware虚拟机 桥接到物理网络 IP: 192.168.1.33 cobbler2.8.5 系统CentOS7.9 VMWare虚拟机 桥接到物理网络 IP:192.168.1.33 安装cobbler3.3 yum源修改 cat /etc/yum.repo.d/Cento…

指针(一)------指针概念+指针类型+野指针+指针运算+二级指针

💓博主csdn个人主页:小小unicorn ⏩专栏分类:C语言 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 指针(一) 指针是什么指针…

Debezium快问快答

什么是 debezium? debezium 是一系列分布式服务的集合,这些服务可以捕获数据库中行级别的更改,应用程序可以根据这些变化来做相应的处理。 debezium 在事务日志中记录提交给每个数据库表的所有行级别的更改,每个应用程序可以只读取自己感兴趣的事务日志,并按照更改时间发…

ModaHub魔搭社区:自动化机器学习Auto-Sklearn全面详细教程

Auto-Sklearn的简介 Auto-Sklearn(基于scikit-learn库的自动化的机器学习工具)的概述 简介 Auto-Sklearn,在2015年由德国图宾根大学的研究人员提出的,最初的版本于2016年发布。auto-sklearn基于scikit-learn库进行开发,支持多种机器学习任务,包括分类、回归、时间序列…

php 权限节点的位运算

一,概述 在 PHP 中,位运算可以用来进行权限节点的判断。通常,每个权限节点都会用一个不同的位表示(2的n次方,从0开始),可以将这些位组合成一个权限值。然后,可以使用位运算符来检查…

【Unity】URP屏幕后处理UI模糊效果实现

这里Canvas(1)设置为Overlay能渲染出指定UI高清,其他UI模糊,然而这做法非常不好,如果此时再打开UI 以及 关闭模糊效果 要将这些置顶UI 恢复到原本Canvas里,也就是要管理2套Canvas using System; using System.Collections; using…

【算法与数据结构】404、LeetCode左叶子之和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:思路比较简单,遍历所有节点然后判断该节点是否为左叶子节点,如果是&#xff0c…

Python3 命令行参数

Python 提供了 getopt 模块来获取命令行参数。 $ python test.py arg1 arg2 arg3 Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表。 len(sys.argv) 计算命令行参数个数。 注:sys.argv[0] 表示脚本名。 实例 t…

静态成员(个人学习笔记黑马学习)

1、静态成员变量 所有对象共享同一份数据在编译阶段分配内存类内声明&#xff0c;类外初始化 #include <iostream> using namespace std; #include <string>class Person { public://1 所有对象都共享一份数据//2 编译阶段就分配内存//3 类内声明&#xff0c;类外初…

windows11 利用vmware17 安装ky10-server-x86操作系统

下载相关软件和镜像 vmware17 下载 下载页面 Download VMware Workstation Pro ky10server-x86镜像下载 官网 国产操作系统、银河麒麟、中标麒麟、开放麒麟、星光麒麟——麒麟软件官方网站 (kylinos.cn) 选择对应版本去下载 安装 选择镜像&#xff0c;点击下一步 磁盘设置要…

jupyter notebook中查看python版本的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

ssm+vue宠物领养系统源码和论文

ssmvue宠物领养系统源码和论文103 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 本课题是根据用户的需要以及网络的优势建立的一个宠物领养系统&#xff0c;来满足用宠物领养的需求。 本宠物领养系统…

Android JNI系列详解之生成指定CPU的库文件

一、前提 这次主要了解Android的cpu架构类型&#xff0c;以及在使用CMake工具的时候&#xff0c;如何指定生成哪种类型的库文件。 如上图所示&#xff0c;是我们之前使用CMake工具默认生成的四种cpu架构的动态库文件&#xff1a;arm64-v8a、armeabi-v7a、x86、x86_64&#xff0…

5年测试在职经验之谈:2年功能测试、3年自动化测试,从入门到不可自拔...

毕业3年了&#xff0c;学的是环境工程专业&#xff0c;毕业后零基础转行做软件测试。 已近从事测试行业8年了&#xff0c;自己也从事过2年的手工测试&#xff0c;从事期间越来越觉得如果一直在手工测试的道路上前进&#xff0c;并不会有很大的发展&#xff0c;所以通过自己的努…

KVM虚拟化ubuntu

KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一种基于Linux内核的虚拟化技术&#xff0c;它将Linux内核作为虚拟机的底层操作系统&#xff0c;利用硬件虚拟化支持创建和管理虚拟机。KVM虚拟化技术被广泛应用于云计算、虚拟化服务器、虚拟化桌面等场景。 KVM虚拟…

CodeBlocks20.03配置wxWidgets

背景 - 现在是2023年 1. 很多年前&#xff0c;下载使用CodeBlocks就发现里面有自带的wxWidgets Project的项目&#xff0c;然而一路Next下去出来的程序根本就不能运行&#xff0c;心有不甘&#xff1b; 2. 前几年&#xff0c;用python做小工具的时候&#xff0c;界面用的wxPy…

编程题四大算法思想(三)——贪心法:找零问题、背包问题、任务调度问题、活动选择问题、Prim算法

文章目录 贪心法找零问题&#xff08;change-making problem&#xff09;贪心算法要求基本思想适合求解问题的特征 背包问题0/1背包问题0/1背包问题——贪心法 分数背包问题 任务调度问题活动选择问题活动选择——贪心法最早结束时间优先——最优性证明 Prim算法 贪心法 我在当…

pytorch中nn.Conv1d功能介绍

在使用Conv1d函数时&#xff0c;pytorch默认你的数据是一维的&#xff0c;比如一句话“深度学习”可以用一个一维数组 [深, 度, 学, 习] 表示&#xff0c;这个数据就是一维的。图片是二维数据&#xff0c;它有长宽两个维度。 因此在使用 Conv1d 函数时&#xff0c;输入是一个三…

java八股文面试[多线程]——synchronized锁升级详细流程

偏向锁 偏向锁是JDK6中的重要引进&#xff0c;因为HotSpot作者经过研究实践发现&#xff0c;在大多数情况下&#xff0c;锁不仅不存在多线程竞争&#xff0c;而且总是由同一线程多次获得&#xff0c;为了让线程获得锁的代价更低&#xff0c;引进了偏向锁。 偏向锁是在单线程执…