我正在从教程点查看以下代码:
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。我不明白为什么代码工作需要这个!有人可以向我解释一下吗?
答案 0 :(得分:1)
这不是一个很好的例子。
减法后,al
包含6.
aas
指令不执行任何操作,因为al
的高半字节为零。
0的ASCII码是30h。 “或者”用6产生36h,即ASCII“6”。通常,这会将十进制数字的二进制值转换为ASCII代码。
听起来您将从研究二进制值与其ASCII表示之间的差异中受益。请参阅示例an ASCII table。
但是请注意,这段代码(AFAICS)是错误的,因为它将一个16位字存储到一个保留字节中。