首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NASM中的strlen

NASM中的strlen
EN

Stack Overflow用户
提问于 2013-11-05 19:50:05
回答 2查看 2.1K关注 0票数 5

失陪了。我正在努力理解,学习汇编语言。不过,我有很多问题。我正尝试在NASM中处理字符串。我将字符串常量复制到string变量。最大尺寸是50。所以我要确认一下这个界限。然而,这个程序抛出一个分段错误。我在MASM中使用了一个示例,所以使用NASM语法可能存在一个使用错误。我的计划如下:

代码语言:javascript
复制
section .data                                                                                                                    
   MAXTEXTSIZE equ 50
   _cte_hola db "Hola", 0
   _cte_mundo db "Mundo", 0

section .bss
   MAIN_d resb MAXTEXTSIZE+1

section .text
      global _start

strlen:
  mov bx, 0
  strl01:
  cmp WORD [SI+BX],0 t
  je strend 
  inc bx 
  jmp strl01
strend:
  ret

strcpy:
   call strlen 
   cmp bx, MAXTEXTSIZE 
   jle copiarsizeok    
   mov bx, MAXTEXTSIZE
copiarsizeok:mov cx, bx
   cld 
   rep movsb 
   mov al,0 
   mov BYTE [DI], al
   ret


_start:
  mov ds, ax
  mov es, ax
  mov si, [MAIN_d]
  mov di, [_cte_hola]
  call strcpy
  mov eax, 1
  mov ebx, 0
  int 80h  

先谢谢,失陪了。我的问题对装配程序员来说是愚蠢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-05 20:15:49

我相信您正在尝试在Linux中制作32位程序,但是您的示例是16位。

  1. 在Linux中,所有指针都是32位。因此,使用扩展寄存器: esi、edi、ebx等。您仍然可以使用8位和16位寄存器进行算术和数据处理,但不能用作内存指针。
  2. 在strlen中,您必须比较byte [esi+ebx], 0,而不是word。
  3. 不要在Linux中设置段寄存器。它们将由操作系统设置,您不能触摸它们。在Linux中,所有内存都是一个平面区域,您不必再使用段寄存器了。
票数 2
EN

Stack Overflow用户

发布于 2013-11-05 20:40:26

下面是一个更具体的示例,说明如何编写strlen函数(这是您遇到的第一个问题)

代码语言:javascript
复制
section .data
  MAXTEXTSIZE equ 50
  _cte_hola  db "Hola",  0xa, 0
  _cte_mundo db "Mundo", 0

section .bss
  MAIN_d resb MAXTEXTSIZE+1

section .text
  global _start

strlen:
  mov ebx, 0
strlen_loop:
  cmp BYTE [esi+ebx], 0
  je strlen_end
  inc ebx
  jmp strlen_loop
strlen_end:
  mov eax, ebx
  ret

_start:
  mov esi, _cte_hola
  call strlen ; Get the length of _cte_hola

  mov edx, eax ; The length was stored in eax by strlen
  mov ecx, _cte_hola
  mov ebx,1
  mov eax, 4
  int 0x80 ; Write to stdout

  mov eax, 1
  int 0x80 ; Exit

当然有更好的方法来实现这个(例如,我会使用repne来实现strlen ),但是我希望将它与您的实现保持在一起。

希望这能有所帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19797609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档