汇编解决的第一个小问题

原创 2016年05月30日 16:54:27
一朝掌握汇编语言,终生理解计算机系统。

--题记

现在计算机发展及其迅速,我们能学可学的东西很多,汇编语言已经不再像以前那样必要,但是底层的东西变化却很慢,学习以下我觉得是不吃亏的,尤其是以后立志走C/C++ 路线的程序员。

一句话:我学的就是情怀!

昨天学妹问我一个问题,很简单。是这样的。
#include<stdio.h>


int main(){

    char a;
    short b;
    scanf("%c",&a);
    scanf("%d",&b);
    printf("%c %d \n",a,b);

}
为什么这里的a 变量不能打印。 现在我们逐层分析: 相信C语法不错的同学都能看到%d 和 short 不对等,语法不对,确实是这样。 可是为什么这样? 这就需要了解变参函数知识了,变参函数中参数不对等,对很靠近答案了。 但是明明是b错了,但是为什么是a有问题? 我们看看汇编代码:
	.file	"tt.c"
	.section	.rodata
.LC0:
	.string	"%c"
.LC1:
	.string	"%hd"
.LC2:
	.string	"%c %d \n"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$16, %rsp
	leaq	-1(%rbp), %rax
	movq	%rax, %rsi
	movl	$.LC0, %edi
	movl	$0, %eax
	call	__isoc99_scanf
	leaq	-4(%rbp), %rax
	movq	%rax, %rsi
	movl	$.LC1, %edi
	movl	$0, %eax
	call	__isoc99_scanf
	movzwl	-4(%rbp), %eax
	movswl	%ax, %edx
	movzbl	-1(%rbp), %eax
	movsbl	%al, %eax
	movl	%eax, %esi
	movl	$.LC2, %edi
	movl	$0, %eax
	call	printf
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (GNU) 4.9.2 20150212 (Red Hat 4.9.2-6)"
	.section	.note.GNU-stack,"",@progbits
我们可以看到,edi 寄存器保存的是变参。 当我们使用"%d"接收参数的时候,想当于直接给存放b的寄存器强制放了4字节内容,我们知道程序在运行时是以栈的形式存储变量的,所以4字节的b强行符覆盖到了a.所以变量a  的内容被改变了。  

查看原文:http://zmrlinux.com/2016/05/30/%e6%b1%87%e7%bc%96%e8%a7%a3%e5%86%b3%e7%9a%84%e7%ac%ac%e4%b8%80%e4%b8%aa%e5%b0%8f%e9%97%ae%e9%a2%98/
版权声明:本文为博主原创文章,未经博主允许不得转载。

win32汇编第一个窗口程序

窗口程序的运行过程 (1)得到应用程序的句柄(GetModuleHandle)。 (2)注册窗口类(RegisterClassEx),在注册之前,要填写RegisterClassEx的参数WNDCLA...
  • weixin_36796040
  • weixin_36796040
  • 2017年12月17日 20:06
  • 140

汇编语言第一个程序

在win7里面编写汇编语言,下载DOSBox就能够在win7里运行编译汇编代码。 下载http://pan.baidu.com/s/1dEs92Rf安装DOSBox0.74-win32-install...
  • u010411264
  • u010411264
  • 2016年01月10日 19:48
  • 1843

***汇编语言 实验10.2 解决除法溢出的问题

汇编语言 实验10.2 解决除法溢出的问题写给自己的一些题外话: 因为各种各样(考试,加上萎靡的精神状态)的原因,在这一题卡了好几天,就是搞不懂商和余数的表示,直到今天才恍然大悟,下面我先总结一下di...
  • lucas_w17
  • lucas_w17
  • 2017年05月23日 23:42
  • 341

自己第一个汇编程序:Hello World !

      也许是一种兴趣,也许是一种执着,也许是一种追求,所以选择学习汇编。在这之前看过部分汇编的视频,讲到CPU结构、寄存器之类头蒙了,有种当初连Windows API都没掌握一点的前提下去看MF...
  • wangningyu
  • wangningyu
  • 2009年08月11日 09:31
  • 7999

Win32汇编——第一个窗口程序

1.窗口程序的运行模式:消息驱动 2.窗口程序实现大部分功能的代码应该呆在同一个模块中——“消息处理”模块,这个模块可以随时应付所有类型的消息,只有这样才能随时响应用户的各种操作。 3.窗口程序的运行...
  • kisbuddy
  • kisbuddy
  • 2011年08月09日 14:11
  • 1276

工作中的一个小问题

今天同事看了一句我以前写的代码,用了三元运算符  PropertyScript.instance .isLifeFreeze = PropertyScript.instance .isLifeFree...
  • u010386327
  • u010386327
  • 2013年07月25日 18:06
  • 562

汇编中使用EBP传递参数和变量

EBP+C: second parameter EBP+8: first parameter EBP+4: return address EBP:   previous EBP EBP-4: ...
  • jimoguilai
  • jimoguilai
  • 2014年06月04日 16:33
  • 1635

工作中遇到点小问题

今天给一家客户维护网吧, 装的是VD还原,管理软件是长春同联软件,装完之后吧台可以解锁客户端,但是顾客上机交押金缺总是锁屏,用TASKKILL 清理C盘进程后,运行同联管理软件一切正常,判断VD保护软...
  • xuyingcctv
  • xuyingcctv
  • 2007年12月02日 15:23
  • 216

使用汇编代码点亮一个LED灯

汇编代码:.text.global _start_start:           LDR  R0,=0x56000010           MOV  R1,# 0x00001000        ...
  • farsight2010
  • farsight2010
  • 2010年01月27日 20:18
  • 4089

王爽《汇编语言》实验10.2——解决除法溢出的问题

王爽《汇编语言》实验10.2——解决除法溢出的问题 被除数位dword型,除数为word型, 结果为dword型。...
  • mp4spig
  • mp4spig
  • 2016年08月08日 00:48
  • 1152
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:汇编解决的第一个小问题
举报原因:
原因补充:

(最多只允许输入30个字)