【问题标题】:NASM assembly, How to print the first 4 bytes of a string arrayNASM 程序集,如何打印字符串数组的前 4 个字节
【发布时间】:2015-12-05 12:19:57
【问题描述】:

如果names 是一个名称字符串数组,存储方式如下: 汤姆鲍勃彼得吉姆。如何分开并分别推送每个名称?每个名称占用 4 个字节对吗?这是我尝试过的,但它会打印整行:

      ;printf("Name %d:\t%s\n",x+1,names[x]);

      mov ecx, dword x
      mov edx, names
      lea ebx, [edx+ecx*4]
      push ebx
      inc ecx
      push ecx
      push szOut
      call _printf
      add esp, 12

【问题讨论】:

  • Peter 是四个字节吗?
  • 你能用代码展示一个简单的例子吗?
  • 名称需要以零结尾。要么修复名称数据,要么让指向数据的指针的名称数组包含一个指向额外全零名称的指针。然后保存name[x+1],name[x+1] = 0,打印,恢复name[x+1]。

标签: arrays assembly nasm


【解决方案1】:

您需要在每个名称的末尾添加一个零(首先将字符保存在那里)。在汇编时定义 char *names[] 的示例,Microsoft 语法:

        .data
name0   db      "Tom"
name1   db      "Bob"
name2   db      "Peter"
name3   db      "Jim"
nameend db      0
szOut   db      "%d %s",00ah,000h
        align   4                       ;put on 4 byte boundary
names   dd      name0, name1, name2, name3, nameend
numnam  dd      ($-names)/4 - 1         ;in this case, numnam == 4
x       dd      0
        .code
        extern  _printf:proc
_main   proc    near
        xor     ebx,ebx                 ;bh == 0
        mov     ecx, x                  ;esi = ptr to name
main0:
        mov     esi, names[ecx*4]
        mov     edi, names+4[ecx*4]     ;edi = ptr to end name
        mov     bl, [edi]               ;save last char
        mov     [edi],bh                ;set zero
        push    esi                     ;display name
        push    ecx
        push    offset szOut
        call    _printf
        add     esp, 12
        mov     [edi],bl                ;restore last char
        inc     x                       ;loop till done
        mov     ecx,x
        cmp     ecx,numnam
        jnz     main0
        xor     eax,eax
        ret

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多