关于 “Hello world” 的程序

zhulinjia 2009-03-13 04:40:00
include		windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib

; 数据段

.data
szCaption db 'A MessageBox !',0
szText db 'Hello, World !',0

; 代码段

.code
start:
invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK
//第二个参数 和第三个参数 不是用来接收地址的吗? 怎么偏移地址也行?偏移地址不是一个完整的地址啊
invoke ExitProcess,NULL

end start

谢谢 帮忙讲解下
...全文
102 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2009-03-13
  • 打赏
  • 举报
回复
这里要求的就是偏移地址,Windows程序中通常使用的都是偏移地址(因为cs、ds、es、ss都是完全重叠的)。
BAYNPU 2009-03-13
  • 打赏
  • 举报
回复

这条指令也可以写出成: invoke MessageBox,NULL,ADDR szText,ADDR szCaption,MB_OK
invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK
主要是引用局部变量的地址和全局变量的地址.
hjjdebug 2009-03-13
  • 打赏
  • 举报
回复
我来讲解一下,先给出反汇编代码:
00401000 >/$ 6A 00 PUSH 0 ; /Style = MB_OK
00401002 |. 68 00304000 PUSH messageb.00403000 ; |Title = "A MessageBox !"
00401007 |. 68 0F304000 PUSH messageb.0040300F ; |Text = "Hello, World !"
0040100C |. 6A 00 PUSH 0 ; |hOwner = NULL
0040100E |. E8 0D000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
00401013 |. 6A 00 PUSH 0 ; /ExitCode = 0
00401015 \. E8 00000000 CALL <JMP.&kernel32.ExitProcess> ; \ExitProcess


由此可以看出,offset szText = 0x403000
offset szCaption = 0x40300F
这里的offset 修饰符,实际上就是内存的完整地址。编译器帮我们计算好了。

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧