标题:随心的Win32汇编作业本
取消只看楼主
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
结帖率:100%
 问题点数:0 回复次数:20 
随心的Win32汇编作业本
第一个程序
程序代码:
;告诉编译器要使用80386的指令集
.386

;告诉编译器程序的模式,win32模式下只能使用flat模式,stdcall告诉编译器参数的传递模式
;参数的传递方式有三种,stdcall, c, pascal
;stdcall: 从右到左压入堆栈,
.model flat, stdcall 

option casemap :none ; case sensitive 是否对大小写敏感

;调用API函数所必须的头文件
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib

;.data 或 .data?

;指明了接下来是数据段,.data 定义了预定义的变量,
;.data?定义了未初始化的变量,
;两者的不同之处是 .data? 定义的变量并不占用 .exe 文件的大小,
;而是在程序执行时动态分配,
;所以开始是不指定初始值的数据可以放在 .data? 段中,
;如一个1K大小的缓冲区,放在 .data?中,程序将不会增加一个字节。
.data

szCaption db 'Win32汇编例子',0
szText db '我要学习Win32汇编!!',0


;.code
;指明了接下来是代码段,我们的所有代码都放在这里。
;最后的一句 start 语句指定了程序开始执行的语句。
;程序中的 ExitProcess 是一个标准的 Win32 API,
;对应 Dos汇编中的 int 20h 或 mov ah,4ch/int 21h,也就是程序退出。
;而 MessageBox 也是一个标准的 API,功能是在屏幕上显示一个消息框,
;还有要注意的是 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK 语句中,
; MB_OK 和 NULL 已经预定义在 Windows.inc 中。
.code

start:
invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK
invoke ExitProcess,NULL

end start


[[it] 本帖最后由 随心 于 2008-9-19 03:55 编辑 [/it]]
搜索更多相关主题的帖子: 作业本 汇编 随心 
2008-09-09 02:38
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
得分:0 
第二个程序:Hello World!
程序代码:
DATAS  SEGMENT
     STRING  DB  'Hello Wowrld!',13,10,'$'    ;原来13 10是回车换行...
DATAS  ENDS

CODES  SEGMENT
     ASSUME    CS:CODES,DS:DATAS
START:
     MOV  AX,DATAS
     MOV  DS,AX
     LEA  DX,STRING
     MOV  AH,9
     INT  21H
   
     MOV  AH,4CH
     INT  21H
CODES  ENDS
    END   START


天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-09-10 00:53
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
得分:0 
决定还是从DOS汇编学起

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-09-10 00:54
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
得分:0 
四楼的代码我注释了下,不知道有没有错
程序代码:
;数据段
DATAS  SEGMENT
     STRING  DB  'Hello Wowrld!',13,10,'$';定义一个字符串,13,10是回车换行的意思,字符串以'$'结尾
DATAS  ENDS

;代码段
CODES  SEGMENT
     ASSUME    CS:CODES,DS:DATAS    ;指定各段使用的寄存器
START:    ;程序开始
     MOV  AX,DATAS    ;开始数据段寻址
     MOV  DS,AX        ;mov指令不能直接将数据段地址直接写入DS,只能通过寄存器来写入
     
     
     LEA  DX,STRING    ;得到字符串变量地址
     MOV  AH,9
     INT  21H        ;调用21H中断的9号功能,用来显示字符串,好比C语言的puts();
   
     MOV  AH,4CH
     INT  21H        ;调用21H的4C功能,返回操作系统(DOS)
CODES  ENDS            ;;代码段结束
    END   START        ;;;指明程序的入口地址,相当于C里的main();    

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-09-10 01:06
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
得分:0 
第三个程序:两个数相加(3+5), -,-两个数相加要这么麻烦
程序代码:
;定义数据段
DATAS  SEGMENT
    FIVE  DB    5    ;定义一个字节型变量 BYTE FIVE = 5;
DATAS  ENDS

;定义堆栈段
STACKS  SEGMENT
      DB  128 DUP (?)    ;BYTE s[128];
STACKS  ENDS

;代码段开始
CODES  SEGMENT
     ASSUME    CS:CODES, DS:DATAS, SS:STACKS    ;指定各段使用的寄存器
START:

    MOV AX,DATAS
    MOV DS,AX        ;数据段寻址
    
    MOV AL,FIVE        ;int a = FIVE;
    ADD AL,3        ; a += 3;
    ADD AL,30H        ;30H:0的ASCLL值,??? 这里应该是类型转换吧?????/
    
    ;;开始显示
    ;2号调用:在显示器上显示输出单个字符,
    ;调用格式:mov dl, 要显示字符的ASCLL码值
    MOV DL,AL
    MOV AH,2
    INT 21H
    
    MOV AH,4CH
    INT 21H
CODES  ENDS
    END  START


天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-09-10 01:45
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
得分:0 
第四个程序:
哇...原来Hello World也可以这样写
程序代码:
INCLUDE MACROOUT.LIB    ;调用汇编宏库
DATAS SEGMENT
    STRING  DB 'Hello World',13,10,'$'
DATAS ENDS
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX        ;数据段寻址
    
    OUTPUT STRING    ;调用OUTPUT宏来输出字符串
    MOV AH,4CH
    INT 21H
CODES ENDS

    END START


天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-09-10 01:55
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
得分:0 
不过看起来那个宏只做了下面工作:
     LEA  DX,STRING
     MOV  AH,9
     INT  21H
一行换三行,值,不过要加include 语句

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-09-10 01:57
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
得分:0 
第五个程序:从1加到100
这个程序是我在网上找的,然后自己做注释进行分析,看了一半看不下去了
先发上来,有时间继续看.
程序代码:
;***********   
  data segment   
  result dw ?   
  data ends   
  ;***********   
  code segment   
  assume cs:code,ds:data  
   
start:   
  push ds       ;
  sub ax,ax   
  push ax   
    
  mov ax,data     ;数据段寻址  
  mov ds,ax   
    
  mov cx,100      ;CX自动计数
  sub   ax,ax      ;清空AX, 
lop:   
  inc ax   
  add bx,ax   
  loop lop       ;累加
    
  mov result,bx   ;保存结果
    
  mov ch,4 
    
aa:   
  mov cl,4   
  rol bx,cl       ;取bx高4位
  
  mov al,bl       ;从这以后就看不明白了??????
  and al,0fh   
  add al,30h   
  cmp al,3ah   
  jl printit   
  add al,7h   
  
printit:  
  mov dl,result   
  mov ah,2   
  int 21h   
  dec ch   
  jnz aa   
    
  retf   
  code ends   
  ;***********   
  end start

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-09-10 23:03
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
得分:0 
一点感想:
汇编做一点点事都很麻烦,就像那个从1加到100的程序,如果用C很容易实现.
但我觉得汇编应该比C快.同样的C程序如果反汇编一下,应该要比汇编代码长得多吧.有时间试试.
我觉得汇编不是难的,不过重要的是把一些指令理解透彻了.
其实汇编很有意思

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-09-10 23:07
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
得分:0 
回复 14# 你们都要疼我哦 的帖子
14楼辛苦了,经过你的一阵子猛,我明白了
下面是我的注释,不知道还有没有错的地方
对了,这两句话很好,我记下了.
程序代码:
;***********   
  data segment   
  result dw ?   
  data ends   
  ;***********   
  code segment   
  assume cs:code,ds:data  
   
start:   
  push ds       ;
  sub ax,ax   
  push ax   
    
  mov ax,data     ;数据段寻址  
  mov ds,ax   
    
  mov cx,100      ;CX自动计数
  sub   ax,ax      ;清空AX, 
lop:   
  inc ax   
  add bx,ax   
  loop lop       ;累加
    
  mov result,bx   ;保存结果
    
  mov ch,4 
    
aa:   
  mov cl,4   
  rol bx,cl       ;取bx高4位
  
  mov al,bl       ; 
  and al,0fh       ;
  add al,30h       ; 转化成ASCLL码
  cmp al,3ah       ; 是否小于'9'
  jl printit       ; 如果是,打印出来
  add al,7h       ; 加7就变成A B C D E F等值 
  
printit:  
  mov dl,result   ; 把结果放入dl
  mov ah,2         ; 调用2号中断输出字符
  int 21h   
  dec ch             ; ch--
  jnz aa             ; 累加器不为0,则跳到aa继续执行
    
  retf             ; 退出
  code ends   
  ;***********   
  end start

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-09-11 00:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-232219-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064091 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved