汇编语言 常量

NASM 提供了几个定义常量的指令。在前面的章节中,我们已经使用过 EQU 指令。

我们将特别讨论 3 个指令:

  • EQU

  • %assign

  • %define


EQU 指令

EQU 指令用于定义常量。EQU 指令的语法如下:

  1. CONSTANT_NAME EQU expression

比如,

  1. TOTAL_STUDENTS equ 50

然后,您可以在代码中使用此常量值,例如:

  1. mov ecx, TOTAL_STUDENTS
  2. cmp eax, TOTAL_STUDENTS

EQU 语句的操作数可以是表达式-

  1. LENGTH equ 20
  2. WIDTH equ 10
  3. AREA equ length * width

以上代码段将 AREA 定义为 200

实例

以下实例演示了 EQU 指令的使用:

  1. SYS_EXIT equ 1
  2. SYS_WRITE equ 4
  3. STDIN equ 0
  4. STDOUT equ 1
  5. section .text
  6. global _start ;必须声明 gcc
  7. _start: ;告诉链接器入口
  8. mov eax, SYS_WRITE
  9. mov ebx, STDOUT
  10. mov ecx, msg1
  11. mov edx, len1
  12. int 0x80
  13. mov eax, SYS_WRITE
  14. mov ebx, STDOUT
  15. mov ecx, msg2
  16. mov edx, len2
  17. int 0x80
  18. mov eax, SYS_WRITE
  19. mov ebx, STDOUT
  20. mov ecx, msg3
  21. mov edx, len3
  22. int 0x80
  23. mov eax,SYS_EXIT ;系统调用号 (sys_exit)
  24. int 0x80 ;调用内核
  25. section .data
  26. msg1 db'Hello, programmers!',0xA,0xD
  27. len1 equ $ - msg1
  28. msg2 db 'Welcome to cankaoshouce.com,', 0xA,0xD
  29. len2 equ $ - msg2
  30. msg3 db 'Learn assembly programming! '
  31. len3 equ $- msg3

结果为:


  1. Hello, programmers!
  2. Welcome to cankaoshouce.com,
  3. Learn assembly programming!

%assign 指令

%assign 指令像 EQU 指令一样可以用来定义数字常量。该指令支持重新定义。例如,您可以将常量 TOTAL 先定义为:

  1. %assign TOTAL 10

在代码的后面,您可以将其重新定义为:

  1. %assign TOTAL 20
注意 :指令区分大小写。

%define 指令

%define 指令可以定义数值和字符串常量。该指令类似于 C 语言中的 #define。例如,您可以将常量 PTR 定义为:

  1. %define PTR [EBP+4]

上面的代码用 [EBP + 4] 替换了 PTR

该指令也支持重新定义,并且区分大小写。