- mov 指令
-
- 语法形式:
-
- mov destination_operand source_operand
-
- 类似于高级语言的以下形式:
-
- destination_operand = source_operand
-
- mov 指令的注意事项:
-
- x86_64 指令集不允许两个操作数都是内存变量。
- mov 指令的两个操作数必须大小相同。
从技术上讲,mov 指令是将数据从一个地方拷贝到了另一个地方,而不是移动。该指令不会破坏源操作数(source_operand)中的原始数据。
-
add 指令和 sub 指令
-
- 语法形式:
- add|sub destination_operand source_operand
- 类似于高级语言的以下形式:
- destination_operand = destination_operand + source_operand
- destination_operand = destination_operand - source_operand
- destination_operand = destination_operand + source_operand
- 语法形式:
常量操作数的最大值限制为 32 位。
-
lea 指令 - 语法形式:
- lea reg, memory_var
- 类似于高级语言的取地址符"&"
- 语法形式:
有时需要将变量的地址加载到寄存器中,而不是加载该变量的值,便可使用该指令。
-
call 指令和 ret 指令
为了进行函数调用,需要使用 call 指令和 ret 指令。
-
ret 指令允许使用单个操作数,操作数不指定函数返回值,语法形式:
-
ret
-
-
call 指令可以调用 MASM 过程。该指令可采用两种形式,常用语法形式如下:
-
call proc_name
-
-
MASM 过程 -
MASM 过程包含以下代码行:
-
proc_name proc
-
-
然后是过程主体(通常以 ret 结束)。在过程结束时(通常紧随 ret 指令后)使用以下语句结束过程:
- proc_name endp
-
MASM 数据类型
|
|
|
|
1 | 无符号整数 |
sbyte | 1 | 有符号整数 |
word(dw) | 2 | 无符号整数 |
sword | 2 | 4有符号整数 |
dword(dd) | 4 | 无符号整数 |
sdword | 4 | 有符号整数 |
qword(dq) | 8 | 无符号整数 |
sqword | 8 | 有符号整数 |
tbyte | 10 | 无符号整数或BCD |
oword | 16 | 无符号整数 |
real4 | 4 | 单精度浮点数 |
real8 | 8 | 双精度浮点数 |
real10 | 10 | 扩展精度浮点数 |
proc | N/A | 过程标签 |
label: | N/A | 语句标签 |
constant | 可变 | 变量声明 |
text | N/A | 文本替换 |
注释使用分号(;)表示
option 语句指示 MASM 区分所有符号的大小写
option casemap:none
定义数据段
.data
问号(?)表示对象没有显示值(默认初始化为 0)
i8 db ?
u16 sword ?
i32 dd ?
u64 sqword ?
rl8 real8 ?
字符串后面包含 0,表示字符串的结束。ASCII 码的 10 表示换行符
fmtstr db 'string', 10, 0
;定义代码段
.code
伪指令是用来定义子程序或过程的开始的伪指令
; 它通常与 endproc 或 enpd 伪指令一起使用来表示一个过程的开始和结束
main proc
mov al, i8
mov bx, u16
mov r8d, i32
mov r9, u64
mov r10, rl8
lea eax, fmtstr
add bx, 6
sub bx, 5
main endp
end 伪指令标记源代码文件的结束
end
执行前:
执行后:
原文始发于微信公众号(走在网安路上的哥布林):汇编中基本的机器指令和数据类型
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论