或 nasm 中的说明

or instruction in nasm

我正在努力学习 nasm, 按照 this 教程,我编写了这段代码

section .text
   global   _start

_start:
   mov   al,   1ah   ; 0001 1010
   mov   bl,   40h   ; 0100 0000

   or    al,   bl    ; 0101 1010 ==> 'Z'
   add   al,   byte  '0'  ; convert from decimal to ascii

   mov   [result], al 

   mov   eax,  4        ;syscall (write)
   mov   ebx,  1        ;file descirptor 
   mov   ecx,  result   ;message to write
   mov   edx,  1        ;message length
   int   0x80           ;call kernell
   jmp   outprog

outprog:
   mov   eax,  1
   int   0x80

segment .bss
   result   resb  1

nasm -f elf hello.asm ; ld -m elf_i386 -s -o hello hello.o; ./hello 的输出是一个奇怪的字符 �%,它必须打印 'z' 我错过了什么吗?

如果or al, bl ; 0101 1010 ==> 'Z'的评论已经说这是一个角色,那么你还不清楚为什么还要添加一些东西。

您的添加 add al, byte '0'48 添加到 'Z' 的 ASCII 代码中:

  0101 1010    90  'Z'
+ 0011 0000   +48  '0'
  ---------
  1000 1010   138  'è' in codepage 437

添加byte '0'只需要将0到9范围内的值转换为“0”到“9”范围内的字符。


it had to print 'z'

要将大写 'Z' 转换为您似乎期望的小写 'z',加法需要 +32.

mov   al,   1ah   ; 0001 1010
mov   bl,   40h   ; 0100 0000

or    al,   bl    ; 0101 1010 ==> 'Z'
add   al,   32    ; 0111 1010 ==> 'z'