| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8594 人关注过本帖, 1 人收藏
标题:随心的Win32汇编作业本
只看楼主 加入收藏
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
结帖率:100%
收藏(1)
 问题点数:0 回复次数:37 
随心的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
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
同学评语:太认真了。请版主给他打满分。
2008-09-09 07:27
谁与争疯
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:海南省
等 级:版主
威 望:191
帖 子:15071
专家分:17513
注 册:2007-4-22
收藏
得分:0 
校长评语:请该同学的班主任给予该同学跳级

论坛是我家灌水靠大家
2008-09-09 20:14
随心
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
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-09-10 07:32
快速回复:随心的Win32汇编作业本
数据加载中...
 
   



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

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