回 帖 发 新 帖 刷新版面

主题:我准备最近开始学习汇编

希望有人能给我一些建议

回复列表 (共11个回复)

沙发

像C++编程一样多看程序多上机,记住不到万不得已不要看书[em2]

板凳

谢谢,不过能不能说详细点啊

3 楼

[quote]像C++编程一样多看程序多上机,记住不到万不得已不要看书[em2][/quote]
后面的那句话不理解

4 楼


意思是多上机吧,别老拿着本书看

5 楼

我以前总想学汇编,但一直没安心学过,这学期,我们开了汇编,我才开始认真学,我们的老师是个女的,口齿清晰,语速超快,我很喜欢她的讲课风格,我的汇编开始入门了。

    先推荐一本书,清华大学出的“ 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 楼

写了好多,好累,去自习去了。大家都努力吧。一起fighting

7 楼

45645641

8 楼

我学了三四周吧..刚入门...蛮过瘾的

9 楼


羡慕啊[em2]

10 楼


谢谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册