工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 4922|回复: 28

汇编学习...

[复制链接]
发表于 2007-11-8 23:22 | 显示全部楼层 |阅读模式
  • 汇编语言中的中断对应C语言的库函数
  • 汇编没有参数概念!
  • 汇编中的各寄存器为C中的全局变量,每一条指令都有可能直接修改其值
  • 汇编不难,纯粹记忆..

 
 其实指令都没记住几个.
 一点学习感悟,不知有没有错..

评分

1

查看全部评分

发表于 2007-11-9 00:21 | 显示全部楼层
刚刚学。。。觉得几难
回复

使用道具 举报

发表于 2007-11-9 00:28 | 显示全部楼层
感觉比C简单~

最近学verilog

评分

1

查看全部评分

回复

使用道具 举报

发表于 2007-11-9 00:30 | 显示全部楼层
本人肤浅,觉得汇编比较直观
回复

使用道具 举报

发表于 2007-11-9 01:18 | 显示全部楼层
学习中......
回复

使用道具 举报

发表于 2007-11-9 01:18 | 显示全部楼层
曾经为汇编疯狂过...
回复

使用道具 举报

发表于 2007-11-10 14:58 | 显示全部楼层
做过课程设计的路过~

评分

1

查看全部评分

回复

使用道具 举报

发表于 2007-11-10 15:34 | 显示全部楼层
有什么好书介绍?
对汇编感觉却不强的经过!
回复

使用道具 举报

发表于 2007-11-12 20:42 | 显示全部楼层
汇编的好书应该数罗云彬的那本《*****》
回复

使用道具 举报

发表于 2007-11-12 21:13 | 显示全部楼层
我也来看哈,不会这个东西
回复

使用道具 举报

发表于 2007-11-13 00:11 | 显示全部楼层
原帖由 powerwind 于 2007-11-12 20:42 发表
汇编的好书应该数罗云彬的那本《*****》

不要省略呀.
回复

使用道具 举报

发表于 2007-11-13 23:09 | 显示全部楼层
“保护模式下不用考虑内存的分段问题”这句话应该怎么理解?
回复

使用道具 举报

头像被屏蔽
发表于 2007-12-17 11:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-12-17 12:46 | 显示全部楼层
我没认真学过8086,我学的都是win32汇编,感觉楼主说的好像是针对16位(以下)来说的

# 汇编语言中的中断对应C语言的库函数
这个不理解,lz能不能解析一下?
C的库函数在调用的时候已经在内存里面了,汇编调用不就一个call过去吗?
怎么有中断的?


# 汇编没有参数概念!

16位以下我不知道有没有,但是win32是肯定有的
比如说一个api,要几个push参数再call,或者用宏invoke xxx后面接参数
为什么汇编没参数概念?参数是针对函数,而不是针对语言吧?!
而且在调用函数的时候参数一般都放在栈里面,然后用基栈指针ebp+4*n这样来调用参数



# 汇编中的各寄存器为C中的全局变量,每一条指令都有可能直接修改其值

在windows的pe结构中,全局变量是放在.data(已经初始化全局或者静态变量)或者是.bss(未初始化的变量).使用的时候是用寻址来调用,比如mov eax, dword ptr [00405000h]或者宏汇编的mov eax, offset szStr  (其中szStr db 'Hello'),这样eax就是指向Hello全局字符串的指针了

不能说汇编中的寄存器,寄存器是cpu内的,汇编只是操作寄存器而已,而且在32位机中寄存器一般都不直接放全局变量,也没那么多寄存器去放全局变量.每个寄存器都有自己的用途
比如说eax是函数的返回值,ecx为循环变量,edx:eax是64位乘积,esp是栈指针,ebp为基栈指针等等


# 汇编不难,纯粹记忆..
这句话说的好,同意楼主的
汇编的确比C/C++容易多了
而且学了汇编再去学其他语言根本就不费吹灰之力
回复

使用道具 举报

 楼主| 发表于 2007-12-17 13:40 | 显示全部楼层
汇编课程。。确实不涉及WIN32汇编

只是初学汇编的一点感想...
说对应C语言的库函数是因为我是这样理解记忆而已
相对与C语言,库函数所处的层次和在汇编里的中断调用所处的层次相对应
不知有没有理解错。。
不能说汇编中的寄存器,寄存器是cpu内的,汇编只是操作寄存器而已,而且在32位机中寄存器一般都不直接放全局变量,也没那么多寄存器去放全局变量.每个寄存器都有自己的用途
比如说eax是函数的返回值,ecx为循环变量,edx:eax是64位乘积,esp是栈指针,ebp为基栈指针等等

我做的实验就是这样理解和实践。。初学,看来用错了。。
PS:这里说的也是一个对应的理解而已,因为寄存器永远是全局可见的(不知有没有错了...)

在我学的汇编课本里,有“参数”这个词
只是我个人认为,这和C语言等的“参数”不同
某种如果汇编这样的PUSH POP简陋实现也叫参数那么下面C代码 :
  1. int AX,BX,CX;
  2. void swap(){
  3.   int tmp=CX
  4.   CX=Ax;
  5.   AX=BX;
  6.   BX=CX;
  7.   CX=tmp
  8. }
复制代码
也可以算是传递了参数?

其实本帖只是从C语言的角度来学习理解汇编而已

非常感谢楼上的回帖!

评分

1

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2007-12-17 14:01 | 显示全部楼层
原帖由 gyCai 于 2007-11-13 23:09 发表
“保护模式下不用考虑内存的分段问题”这句话应该怎么理解?

以下从书中抄下的:
在保护模式存储器寻址中,仍然要求程序员在程序中指定逻辑地址,只是机器彩另一种比较复杂,或者说比较间接的方法来求得相应的物理地址。因为对程序员来说,并未复杂性。在保护模式下,逻辑地址由选择器和偏移地址两部分组成,选择器存放在段寄存器中,但它不能直接表示段基地址,而由操作系统能过一定的方法取段基地址,再和偏移地址相加加而求得所选存储单元的物理地址

保护模式又称为虚拟模式,也许虚拟这个词更容易理解些
在实模式中,考虑以下两个{段,偏移地址}集合
{A000,FFFF} 和 { AFFF,000F} 两者指向同一物理内存地址
上面的例子来自 C专家编程(Expert C Programming Deep C secrets) P142
不知有没有引用错。。。

关于内存这些高级话题,其实到目前为止没有什么实践,基本上...还是处于半明不白的状态。。
如有错,欢迎指正,谢谢!
回复

使用道具 举报

发表于 2007-12-17 18:28 | 显示全部楼层
int AX,BX,CX;
void swap(){
  int tmp=CX
  CX=Ax;
  AX=BX;
  BX=CX;
  CX=tmp
}

楼主这段程序没有参数了?
请看看C语言里面参数的概念.
上面那些int AX,BX,CX;都是全局变量
int tmp是局部变量,没有参数出现啊


看下面程序
int test (int a, int b)
{
      int c = a + b;
      return c;
}

这里形参a,b,对于在汇编是ebp+4, ebp+8
而c是变量,在栈里面就是ebp-4

void main(void)
{
     test (10, 20);
}
这里在汇编里面call test之前就会先把实参10,20入栈
push 20
push 10
call test
(或者宏汇编invoke test, 10, 20)

不知道这里的a,b楼主认为是形参吗?这里的10,20认为是实参吗?


楼主应该看过深度探索C/C++吧?
回复

使用道具 举报

 楼主| 发表于 2007-12-17 19:06 | 显示全部楼层
不要断章取义...
void swap(void);
这样的函数在C语言里也有参数吗?
我回去再翻翻书看看...

[ 本帖最后由 iptton 于 2007-12-17 19:10 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2007-12-17 19:07 | 显示全部楼层
如果汇编这样的PUSH POP简陋实现也叫参数那么下面C代码 :
回复

使用道具 举报

 楼主| 发表于 2007-12-17 19:08 | 显示全部楼层
我只是从语言层次讨论。。
如果要深入到编译的话,
所有语言最终要执行都只是1和0...

[ 本帖最后由 iptton 于 2007-12-17 19:12 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-12 14:25

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表