王爽-汇编语言-综合研究二-使用寄存器

(一) 研究概述

我们为什么必须使用变量?因为我们在编程时必须存储数据。那么如果可以使用别的方法存储数据,我们就可以不必因此目的而使用变量。

用什么方法来存储数据呢?在学习汇编语言是。我们把数据存储在寄存器和内存空间中。那么,在本次试验中,我们研究的是C语言中如何使用寄存器。

(二) 研究过程

(1) 编写一个程序url.c

编译链接完成,用debug加载。

-u查看如下:

这里的语句比较整齐有逻辑,像是某些功能的实现语句,但是往下-u,几次都看不到所写的语句。

这里,main函数的代码应该是在程序段中的,程序在执行的时候,一条语句要想语句被cpu执行,那么这条语句就必然要在被执行程序的程序段中。在debug中想要找到他的代码只能靠-u,-t等一段一段的查找。yb

(2) 为了找到我们编写的main函数内的语句,再继续编辑如下的程序。

让程序自己现实出main函数的偏移地址。

执行结果如下

可以看到,main的偏移地址是01fa。

但是这个偏移地址是不是正确呢?又是不是通用呢?

这里分析一下,程序在编译链接的过程中,多出来的部分到底是做什么的,是谁添加的。

添加者必然是编译连接程序,而其作用,可能与程序执行前后的现场保护,系统调度等有关系。那,多出来的这一部分,应该是固定的,与我们编写的程序无关的。也就是说,这个偏移地址对于所有的程序来说,都是相同的。那是不是这样呢?我们验证。

用这个偏移地址查看url.exe的代码段

这时,我们看到了我们写在C程序中的代码。

这也证实了我们前面的猜想,添加者必然是编译连接程序,多出来的这一部分,是固定的,与我们编写的程序无关的。同时也说明,main函数的代码,就是在程序段中。

偏移地址之所以能够显示出来,有两种可能:main是一个变量,他存储的就是main在代码段里的偏移变量。或者他就是一个标号。

假如main是一个变量的话,那么他是有自己的存储单元的。那我们通过修改上面的程序,来看看他是不是变量。

编译连接后显示如下

依然显示的是1fa。

假如main是一个变量,这里出现的应该是他的存储单元地址,而不是他的值。所以,main是一个标号。他指向的是我们所写的程序主函数编译链接完之后的第一条语句。

(3) C语言是否讲函数实现为汇编语言中的子程序

在上面的查看中,发现函数后有ret指令。我们设想,C语言有可能将函数实现为汇编语言中的子程序。

在这里我们看到,它确实是把void f(void)这个函数的实现写成了如下的形式:

PUSH BP

MOV BP,SP

MOV AX,BX

ADD AX,CX

POP BP

RET

且与mian函数相邻。

可见C语言确实将函数实现为汇编语言中的子程序。

(三) 附录研究

我们知道,在编写汇编程序的过程中,有些寄存器是不能直接改变数值的。比如,我们想改变cs的值,必须通过‘MOV AX,0001;MOV CS,AX’这种方式间接地改变。那在C语言使用寄存器的时候,应该怎么使用呢?

我们编写如下程序:

编译链接无报错,说明C语言中可以支持直接赋值给cs。

我们debug进入,发现其反编译如下:

我们看到他使用的是MOV AX,0001;MOV CS,AX的形式。也就是说,虽然C语言支持直接赋值,但是在底层,它依然翻译成了间接赋值。只不过中间过程由C语言编译链接时实现。

(四) 研究感悟:

变量不是一定要用的,也不是必须要使用的。存贮变量可以使用寄存器来进行。同时,C语言提供了直接操纵系统底层的语句。

时间: 2024-10-27 05:16:20

王爽-汇编语言-综合研究二-使用寄存器的相关文章

王爽-汇编语言-综合研究四-不使用main函数编程

(一) 研究目的 使用C语言编程,我们一定要使用main函数么? (二) 研究过程 1) 最初的程序 首先,我们编写一个不写main函数的C语言程序. 程序如下: 在编译的过程中,没有发现错误.在链接的过程中发现出现的错误如下: 链接时出现Undefined symbol ‘_main’ in module c0s 这样的错误信息,可能main函数与c0s.obj这个文件有关系. 这时我们想,C语言编译之后的文件后缀名是什么?是.obj.那汇编语言编译后的文件名是什么?也是.obj.这两个文件有

王爽-汇编语言-综合研究三-使用内存空间

(一) 研究概述 数据不仅可以存储在寄存器中,还可以存储在内存中.这次我们就研究在C语言中,怎样直接在内存中存储数据.以及这样做的一些延伸问题.另外,在附录研究中,我们还探究了C语言中循环和分支结构的实现. (二) 研究过程 1) 直接在C语言中使用内存空间 此处援引书中的话: 对于存储空间来说,要使用他们一般都需要给出两个信息:一是指明存储空间所在.是哪个的信息:二是指明存储空间有多大的类型信息. 对于寄存器来说,就需要给出寄存器的名称,寄存器的名称就也包含了他们的类型信息. 对于内存空间来说

王爽-汇编语言-综合研究五-函数接收不定量参数

(一) 研究目的 我们知道,在C语言中,函数是可以传递参数的.有些函数在声明是就定义了要传的参数的个数,比如我们定义void a(int i);这说明函数a只接受一个int型参数.而有些函数,比如print函数,是可以接收不定个数的参数的.那函数是怎样接收不定量参数的呢? (二) 研究过程 1) 有限个数的参数 首先我们来看程序是如何传参数的.我们编写一个程序,让他传递有限个参数: 我们编译链接,然后反汇编查看其代码: 我们看其代码,首先,在main函数中,分别将‘a’与2对应的ASCLL码放到

王爽-汇编语言-综合研究一-搭建简易C环境

(一) 学习过程: 整个过程分为两个部分: 第一:将TC2.0的环境使用虚拟软盘复制到DOS虚拟机中: 打开WinImage,fileànew,由于TC2.0的环境解压后为2.02M,所以我们在Standard format中选择2.88M. 将TC文件夹放入.保存. 在DOS虚拟机中加载做好的软盘.这时A:\内有TC2.0的所有文件了. 此处援引书中的话: 我们在把一个程序拷贝的一个空的目录后,这个目录下只有这一个程序,然后我们运行它,它可以正确运行,我们就认为这个程序在运行中不需要别的文件.

王爽< 汇编语言>实验十二

1 ;此乃安装程序 2 ;功能:将8086cpu中断类型码为0 的中断向量设置为我们编写的中断服务程序入口地址 3 ;该中断在除法发送溢出的时候产生 4 5 assume cs:code 6 code segment 7 main: 8 mov ax,cs 9 mov ds,ax 10 mov si,offset do ;设置ds:si指向源地址 11 12 mov ax,0 13 mov es,ax 14 mov di,200h ;设置es:di指向目的地址 15 16 mov cx,offs

最强大的王爽汇编语言学习环境使用教程

最强大的王爽汇编语言学习环境使用教程 一.前言 这是采用VMwere Workstation 12 pro虚拟机软件,搭建的MS-DOS学习环境,在windowsXP/8/10及linux中均可以使用,在这个环境中,我集成了CCDOS中文系统,pdos中文系统,使用这些系统,可以进行中文输入与显示.还集成了,十分著名的汇编语言调试工具TR,它比debug更加强大.并且集成了适合王爽汇编语言学习的微软汇编语言编译器masm5和dos中最强大的文本编辑器 vim73 for DOS,这是一个支持彩色

王爽汇编语言(第三版)环境搭建(附PDF及工具下载)

一.前言 最近在学习汇编语言,使用的是读者评价非常高的王爽老师写的<汇编语言>(第三版),为了适应现在各个版本的windows操作系统,所以采用VMWare虚拟机来搭建纯DOS环境. 二.需要的工具 VMware-workstation-12.DOS系统镜像文件.汇编编译器masm和连接器link 百度云下载链接:https://pan.baidu.com/s/1gfz4N67 密码:02y1 三.安装VMware-workstation-12 傻瓜式安装,一直点击下一步就可以(虽然网上也可以

王爽&lt;汇编语言&gt;实验十

实验十 3.数值显示(以下程序附带测试程序) 1 ;名称: dtoc 2 ;功能: 将dword型数据转变为表示十进制数的字符串,字符串以0为结尾 3 ;参数: (ax)=dword型数据低字 4 ; (dx)=dword型数据高字 5 ; ds:si指向字符串的首地址 6 ;返回: 无 7 assume cs:code 8 data segment 9 haha dd 4294967295 10 tata dd 16 dup(?) 11 data ends 12 code segment 13

王爽 汇编语言 课程设计1

assume cs:codesg data segment ;year db '1975','1976','1977','1978','1979','1980','1981','1982' db '1983','1984','1985','1986','1987','1988','1989','1990' db '1991','1992','1993','1994','1995' ;income dd 16,22,382,1356,2390,8000,16000,24486 dd 50065,9