在x86程序集中减法

时间:2016-05-01 21:39:53

标签: assembly x86 nasm

我正在从教程点查看以下代码:

section .text
   global _start        ;must be declared for using GCC

_start:                 ;tell linker entry point
   sub     ah, ah
   mov     al, '9'
   sub     al, '3'
   aas
   or      al, 30h
   mov     [res], ax

   mov  edx,len         ;message length
   mov  ecx,msg         ;message to write
   mov  ebx,1           ;file descriptor (stdout)
   mov  eax,4           ;system call number (sys_write)
   int  0x80            ;call kernel

   mov  edx,1           ;message length
   mov  ecx,res         ;message to write
   mov  ebx,1           ;file descriptor (stdout)
   mov  eax,4           ;system call number (sys_write)
   int  0x80            ;call kernel

   mov  eax,1           ;system call number (sys_exit)
   int  0x80            ;call kernel

section .data
msg db 'The Result is:',0xa
len equ $ - msg
section .bss
res resb 1  

我觉得我理解这段代码除了行:

or al, 30h

据我所知,或者是按位或30h是二进制的0011 0000。我不明白为什么代码工作需要这个!有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:1)

这不是一个很好的例子。

减法后,al包含6.

aas指令不执行任何操作,因为al的高半字节为零。

0的ASCII码是30h。 “或者”用6产生36h,即ASCII“6”。通常,这会将十进制数字的二进制值转换为ASCII代码。

听起来您将从研究二进制值与其ASCII表示之间的差异中受益。请参阅示例an ASCII table

但是请注意,这段代码(AFAICS)是错误的,因为它将一个16位字存储到一个保留字节中。