汇编hello-world

汇编系列文章:
https://www.jianshu.com/nb/29822876

来源:

https://www.cnblogs.com/del/archive/2010/04/03/1703689.html
https://blog.csdn.net/u011770174/article/details/77914375
https://bbs.csdn.net/topics/390495916
https://www.zhihu.com/question/22095837
https://www.cnblogs.com/yshblog/p/3379663.html

首先放上一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.386
.model flat, stdcall
option casemap:none

include masm32.inc
include kernel32.inc
includelib masm32.lib
includelib kernel32.lib

.data
szText db "Hello World!", 0

.code
start:
invoke StdOut, addr szText
ret
end start

对程序中内容进行逐一解释:

  • .386表明使用的指令集
  • .model flat, stdcall 表示平坦内存模式,API调用时右边的参数先入栈
  • option casemap:none 表示大小写敏感
  • include的.inc文件与.h类似,若没有就需要进行类似StdOut PROTO STDCALL:DWORD的声明
  • includelib指定使用的库文件
  • .data与.code分别指定数据与代码
  • invoke伪指令用于函数调用
  • ret 是用于子程序返回的指令, 这里用它代替 ExitProcess(在没有生成 Win32 窗口时是可以的)
  • end start让汇编程序结束汇编并且指明程序开始地址,汇编程序看到这个后就会结束并且找到start标签作为起始位置

但是这样输出变量(内存地址上的值)就不方便,可以使用printf函数(这里是crt_printf),如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.386
.model flat, stdcall

include msvcrt.inc
includelib msvcrt.lib

.data
szFmt db 'Hello world! No %d', 0

.code
start:
mov eax, 11
invoke crt_printf, addr szFmt, eax
ret
end start