汇编学习...
[*]汇编语言中的中断对应C语言的库函数
[*]汇编没有参数概念!
[*]汇编中的各寄存器为C中的全局变量,每一条指令都有可能直接修改其值
[*]汇编不难,纯粹记忆..
其实指令都没记住几个.
一点学习感悟,不知有没有错.. 刚刚学。。。觉得几难 感觉比C简单~
最近学verilog 本人肤浅,觉得汇编比较直观 学习中...... 曾经为汇编疯狂过... 做过课程设计的路过~ 有什么好书介绍?
对汇编感觉却不强的经过! 汇编的好书应该数罗云彬的那本《*****》 我也来看哈,不会这个东西 原帖由 powerwind 于 2007-11-12 20:42 发表 https://www.gdutbbs.com/images/common/back.gif
汇编的好书应该数罗云彬的那本《*****》
不要省略呀. “保护模式下不用考虑内存的分段问题”这句话应该怎么理解? 我没认真学过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 或者宏汇编的mov eax, offset szStr(其中szStr db 'Hello'),这样eax就是指向Hello全局字符串的指针了
不能说汇编中的寄存器,寄存器是cpu内的,汇编只是操作寄存器而已,而且在32位机中寄存器一般都不直接放全局变量,也没那么多寄存器去放全局变量.每个寄存器都有自己的用途
比如说eax是函数的返回值,ecx为循环变量,edx:eax是64位乘积,esp是栈指针,ebp为基栈指针等等
# 汇编不难,纯粹记忆..
这句话说的好,同意楼主的
汇编的确比C/C++容易多了
而且学了汇编再去学其他语言根本就不费吹灰之力 汇编课程。。确实不涉及WIN32汇编
只是初学汇编的一点感想...
说对应C语言的库函数是因为我是这样理解记忆而已
相对与C语言,库函数所处的层次和在汇编里的中断调用所处的层次相对应
不知有没有理解错。。
不能说汇编中的寄存器,寄存器是cpu内的,汇编只是操作寄存器而已,而且在32位机中寄存器一般都不直接放全局变量,也没那么多寄存器去放全局变量.每个寄存器都有自己的用途
比如说eax是函数的返回值,ecx为循环变量,edx:eax是64位乘积,esp是栈指针,ebp为基栈指针等等
我做的实验就是这样理解和实践。。初学,看来用错了。。
PS:这里说的也是一个对应的理解而已,因为寄存器永远是全局可见的(不知有没有错了...)
在我学的汇编课本里,有“参数”这个词
只是我个人认为,这和C语言等的“参数”不同
某种如果汇编这样的PUSH POP简陋实现也叫参数那么下面C代码 :int AX,BX,CX;
void swap(){
int tmp=CX
CX=Ax;
AX=BX;
BX=CX;
CX=tmp
}也可以算是传递了参数?
其实本帖只是从C语言的角度来学习理解汇编而已
非常感谢楼上的回帖! 原帖由 gyCai 于 2007-11-13 23:09 发表 https://www.gdutbbs.com/images/common/back.gif
“保护模式下不用考虑内存的分段问题”这句话应该怎么理解?
以下从书中抄下的:
在保护模式存储器寻址中,仍然要求程序员在程序中指定逻辑地址,只是机器彩另一种比较复杂,或者说比较间接的方法来求得相应的物理地址。因为对程序员来说,并未复杂性。在保护模式下,逻辑地址由选择器和偏移地址两部分组成,选择器存放在段寄存器中,但它不能直接表示段基地址,而由操作系统能过一定的方法取段基地址,再和偏移地址相加加而求得所选存储单元的物理地址。
保护模式又称为虚拟模式,也许虚拟这个词更容易理解些
在实模式中,考虑以下两个{段,偏移地址}集合
{A000,FFFF} 和 { AFFF,000F} 两者指向同一物理内存地址
上面的例子来自 C专家编程(Expert C Programming Deep C secrets) P142
不知有没有引用错。。。
关于内存这些高级话题,其实到目前为止没有什么实践,基本上...还是处于半明不白的状态。。
如有错,欢迎指正,谢谢! 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++吧? 不要断章取义...
void swap(void);
这样的函数在C语言里也有参数吗?
我回去再翻翻书看看...
[ 本帖最后由 iptton 于 2007-12-17 19:10 编辑 ] 如果汇编这样的PUSH POP简陋实现也叫参数那么下面C代码 : 我只是从语言层次讨论。。
如果要深入到编译的话,
所有语言最终要执行都只是1和0...
[ 本帖最后由 iptton 于 2007-12-17 19:12 编辑 ]
页:
[1]
2