【问题标题】:or instruction in nasm或 nasm 指令
【发布时间】:2021-12-28 21:10:37
【问题描述】:

我正在努力学习 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' 我错过了什么吗?

【问题讨论】:

  • add al, byte '0' 你的角色'z' ascii.

标签: assembly x86 ascii nasm


【解决方案1】:

如果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”范围内的字符。


它必须打印'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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2011-12-29
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多