主题:我准备最近开始学习汇编
lovevertigo
[专家分:40] 发布于 2006-11-25 20:48:00
希望有人能给我一些建议
回复列表 (共11个回复)
沙发
hjtp [专家分:50] 发布于 2006-11-25 20:54:00
像C++编程一样多看程序多上机,记住不到万不得已不要看书[em2]
板凳
lovevertigo [专家分:40] 发布于 2006-11-25 20:55:00
谢谢,不过能不能说详细点啊
3 楼
菜鸟CHEN [专家分:30] 发布于 2006-11-26 01:11:00
[quote]像C++编程一样多看程序多上机,记住不到万不得已不要看书[em2][/quote]
后面的那句话不理解
4 楼
lovevertigo [专家分:40] 发布于 2006-11-27 22:50:00
意思是多上机吧,别老拿着本书看
5 楼
HomeC [专家分:30] 发布于 2006-11-28 09:15:00
我以前总想学汇编,但一直没安心学过,这学期,我们开了汇编,我才开始认真学,我们的老师是个女的,口齿清晰,语速超快,我很喜欢她的讲课风格,我的汇编开始入门了。
先推荐一本书,清华大学出的“ IBM PC汇编语言程序设计 ”,国产经典汇编教材,近500页34元,也不算贵。
学习一样东西一定要有恒心,有毅力,真真正正的踏下心来,切忌浮躁,不要指望一两天学出点门道来,不像Borland C++ builder,也不像VB,你看不到任何可视化界面。我以前就是浮躁而且找不到兴趣,所以一直没好好学。
汇编这东西和硬件联系太紧密了,所以好多编程思路都是机器的思路,所以要搞清楚计算机是怎么寻址怎么工作的,我推荐的那本书前边讲的足够了。一开始把前四章都看一下,可以比较快的看过,不用全部记住,因为很枯燥的东西,我们很难提起兴趣,知道有哪些指令大概可以作些什么就差不多了,搞清楚寻址。大概前160页吧。
然后就是接触一些程序,从最简单的hello world开始,了解汇编的程序风格,语言结构,语法。看程序,哪里不懂直接查书,也许这不如问的快,但是习惯了,你就会自学了,对于编程,学会查看文档真的是必修课,我现在看windows api的函数还不大好呢,书上讲的都是些基础的,手册类的除外,好多东西看文档会更好些。
回到正题,一开始你看到的那些寄存器什么的,你可能根本就不明白他是干什么用的,即使书上讲的很清楚,但还是一知半解,甚至云雾缭绕的,但是当你看的程序多了,你就自然都明白了,上机编程是必须的。
汇编编程,首先用文本编辑器编写源代码文件,保存为 .asm ,然后用编译器masm.exe编译为目标文件,再用link.exe进行链接生成exe可执行文件。通常我们用TC编程时这些都是在IDE环境下执行的,我们点几下鼠标,在菜单选一下就可以了,汇编不行,你必须自己来。
比如编写好的源文件为 hello.asm, 在dos或windows的命令行模式下,编译的命令 “masm hello.asm”,链接的命令“link hello.obj”,如果都没错就会产生exe文件。
每次变一个程序你都会学会一类指令,那么没几个程序,细数起来的N多条指令,都明白掌握了,关键不在于程序多少,而是真正的明白程序是怎么运行的,为什么要这样编写,只有这样才会学好编程,如果你总做不到,或者感觉到学习编程很努力还是学不会,只有三个选择,1,改变你编程的思维方法,2,改变你的学习方法,3,改行吧,是学不会了,或者能学会,但只能做些小东东。
如果有个高人,最好是会讲东西的高人,指点你的话,你会很快喜欢汇编的,学习它也会很快的。我们老师上来就从第160页开始讲,一开始先将一个程序,hello world,老师把这个程序讲了好几遍,每次讲都加入些新的东西。
第一次讲,一句一句的写好,把每句都讲了,讲到一处就把那一处精讲,比如一开始肯定要定义段,她就把定义段的方法讲了
第二次讲,写完程序了,开始改,先由汇编书写风格的传统模式改成现代模式,然后进行局部替换,比如:返回dos环境,
你可以在开始写:
push ds
mov ax,0
push ax
也可以用int 21H的4CH号调用,
mov ah,4ch
int 21h
也许你还看不懂上边的,接下来我会贴一个程序告诉你。
第三次讲,加入输入,比如你输入自己名字,程序会出现hello xxx字样。
在这里有讲述了输入的方法。
经过N次讲解,你就从中学会了好多,而且每个都是从原理上讲,也就是说,你一点都不懂,也能按照逻辑关系听懂得。大学遇到这样的老师不多了。
现在的大学,课程内容扩充,每科课又压缩课时,老师大多都是按照大纲讲,而且有的人不会讲,最后大家要不就是没兴趣,要不就是听不懂,要不就是学了还是一知半解,最后好像都学过,又都不会。
为了方遍你入门,这里先贴出一个程序hello world。
[b]传统风格[/b]:
;*****************
data segment ;数据段定义开始
str db 'Hello,world!','$' ;定义DB类型的串STR,'$'结束标志
data ends ;数据段定义结束
;*****************
code segment ;代码段定义开始
;----------
assume ds:data,cs:code ;伪指令明确段和段寄存器的关系
start: ;标号,可以自由指定
push ds ;把原段寄存器中的地址压栈
mov ax,0 ;把ax寄存器清零
push ax ;把0压栈
;汇编程序,在装入段时,自动在段前加256B的数据(PSP)程序段前缀,
用来保存程序的相关信息,其中0,1两字节放的就是回到dos环境的调用
int 20H(等同于int 21H的 4CH号功能调用)。
这里压栈就以便返回dos了,
;初始化数据段
mov ax,data
mov ds,ax
;尽管mov指令很强大,但是不支持把数据从data输送到段寄存器ds,所以要先送到中介通用寄存器 AX(随便一个都可以的,这里用ax)
;显示
mov ax,seg str ;把str的地址放到ax中,用seg取str的首地址地址
mov ds,ax ;同样不能用mov ds,seg str,这里用了中介ax
lea dx,str ;把偏移量放到dx中,lea把str的长度求取放到了dx中,可以用mov dx,offset str替换
mov ah,09h ;int 21h在调用时参数在ah中,要调用09H号,所以这里把09h放到ah中
int 21h
;-------------
code ends ;代码段定义结束
;*****************
end start ;结束,end 标号。
[b]现代风格[/b]:
;*****************
data segment
str db 'Hello,world!','$'
data ends
;*****************
code segment
;----------
main proc far ;定义函数main
assume ds:data
start:
mov ax,data
mov ds,ax
mov ax,seg str
mov ds,ax
mov dx,offset str ;这里写成这种
mov ah,09h
int 21h
mov ah,4ch ;这里用int 21h的4ch号调用,所以前边没有写,push ds。。。
int 21h
ret ;return,函数要有返回
main endp ;定义函数结束
;-------------
code ends
;*****************
end start
传统模式和现代模式的区别就在于,现代模式把程序写成函数的组合,更有利于机构化,模块化设计。
我这里说得比较详细,如果真的要学好汇编,看这个还是远不够的,多学多练。切忌浮躁。
我也是刚学汇编不久,还有很多不足,希望大家诚恳的帮助。
我的QQ:253781367,我的计算机技术交流群号:20875124 ,欢迎大家加盟。
觉得好就给我评分哦。
[em2][em2][em2]
6 楼
HomeC [专家分:30] 发布于 2006-11-28 09:17:00
写了好多,好累,去自习去了。大家都努力吧。一起fighting
7 楼
fishingok [专家分:20] 发布于 2006-12-04 17:08:00
45645641
8 楼
fishingok [专家分:20] 发布于 2006-12-18 13:57:00
我学了三四周吧..刚入门...蛮过瘾的
9 楼
lovevertigo [专家分:40] 发布于 2006-12-26 23:00:00
羡慕啊[em2]
我来回复