汇编语言学习五

来源:互联网 发布:阿里旺旺mac最新版本 编辑:程序博客网 时间:2024/05/02 15:53

    从一个例子简单介绍一下汇编程序的结构,可能有些费话,稍微说一下吧.
  ; Example assembly language program -- adds two numbers
  ; Author: R. Detmer
  ; Date:   revised 7/97
  .386
  .MODEL FLAT

  ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD

  INCLUDE io.h            ; header file for input/output

  cr      EQU     0dh     ; carriage return character
  Lf      EQU     0ah     ; line feed

  .STACK  4096            ; reserve 4096-byte stack

  .DATA                   ; reserve storage for data
  number1 DWORD   ?
  number2 DWORD   ?
  prompt1 BYTE    "Enter first number: ", 0
  prompt2 BYTE    "Enter second number: ", 0
  string  BYTE    40 DUP (?)
  label1  BYTE    cr, Lf, "The sum is "
  sum     BYTE    11 DUP (?)
          BYTE    cr, Lf, 0

  .CODE                          ; start of main program code
  _start:
          output  prompt1        ; prompt for first number
          input   string, 40     ; read ASCII characters
          atod    string         ; convert to integer
          mov     number1, eax   ; store in memory

          output  prompt2        ; repeat for second number
          input   string, 40
          atod    string
          mov     number2, eax


          mov     eax, number1   ; first number to EAX
          add     eax, number2   ; add second number
          dtoa    sum, eax       ; convert to ASCII characters
          output  label1         ; output label and sum

          INVOKE  ExitProcess, 0 ; exit with return code 0

  PUBLIC _start                  ; make entry point public

  END                            ; end of source code

   这是一个把两个数相加的例子,
   先看开头
   .386
   .MODEL FLAT
   如果没有指定.386。MASM会接受8086/8088指令集的指令,当指定.386的时候,它还可以

执行80186,80286,80386指令集的指定,当然也可以指定.486,.586使用更大的指令集。

masm6.1的版本至少要.386的指令集。
 
     ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
     说明从外部引用一个函数名为ExitProcess ,它有一个参数名为dwExitCode.
 
     
     INCLUDE io.h
     它使编译器将io.h复制到此文件中,当需要编译这个文件的时候。
     
     cr      EQU   0dh   ; carriage return character
     Lf      EQU   0ah   ; linefeed character
     这个有点像C++中的define,equ定义一个符号代表后面的字符。
 

     .data
     定义数据区,里面可以有未初始化变量或初始化变量。同时又是会见到.data?

和.data并存的情况,此时.data?中一般为未初始化变量。

       number1 DWORD   ?
  number2 DWORD   ?
  prompt1 BYTE    "Enter first number: ", 0
  prompt2 BYTE    "Enter second number: ", 0

   前两个为没有初值得变量,但内存已经分配,为DWORD型。后面两个是BYTE型的数组或者

说字符串。
   string  BYTE    40 DUP (?)
   这句用符号dup表明定义一个大小为40的类型为BYTE的数组。
   .code
   表示开始代码段落。

   _start:
     表示程序的开始,我们可以在编译的时候用entry选项指定程序的入口,不过习惯上使

用_start。
   PUBLIC _start   
   一般名字只在文件内部可见,不过要使外部的文件能够看到这个函数
   END
   表示源程序内容物理结束,后面不会再有程序代码。
原创粉丝点击