迭代程序集中的字符串 (NASM)
Iterate over strings in assembly (NASM)
我正在尝试用 NASM 汇编语言计算字符串 argv[1] 的长度。我认为我走在正确的轨道上。我已将 argv[1] 的地址移至寄存器 eax,现在我想逐字节移动它并与空字符串终止符进行比较。
每次我 运行 代码都会在 null 比较时出现段错误。我的内存索引不正确吗?
*免责声明:这是大型家庭作业的一小部分。
segment .bss
N: resd 1 ;counter for size of argv[1]
segment .text
global asm_main
asm_main:
enter 0,0 ;setup
pusha ;save all registers
mov eax, dword [ebp+8] ;argc to eax
mov ebx, dword [ebp+12] ; address of argv to ebx
mov eax, dword [ebx+4] ; address of argv[1] to eax
mov [N], dword 0 ; N = 0
.loop:
add eax, [N] ; advance index by N
cmp eax, dword 0 ; check for end of string
je .endloop ; break out of the loop if we're done
add [N], dword 1 ; N++
jmp .loop ; loop back for next char
.endloop:
popa
mov eax, 0
leave
ret
经过一些提示和 gdb 的帮助,循环现在看起来像这样:
mov [N], dword 0 ; N = 0
.loop:
cmp [eax], byte 0 ; check for end of string
je .endloop
add eax, dword 1 ; advance index by 1 byte
add [N], dword 1 ; N++
jmp .loop
.endloop:
使用 N 来增加索引是愚蠢的。我需要增加 1.
我正在尝试用 NASM 汇编语言计算字符串 argv[1] 的长度。我认为我走在正确的轨道上。我已将 argv[1] 的地址移至寄存器 eax,现在我想逐字节移动它并与空字符串终止符进行比较。
每次我 运行 代码都会在 null 比较时出现段错误。我的内存索引不正确吗?
*免责声明:这是大型家庭作业的一小部分。
segment .bss
N: resd 1 ;counter for size of argv[1]
segment .text
global asm_main
asm_main:
enter 0,0 ;setup
pusha ;save all registers
mov eax, dword [ebp+8] ;argc to eax
mov ebx, dword [ebp+12] ; address of argv to ebx
mov eax, dword [ebx+4] ; address of argv[1] to eax
mov [N], dword 0 ; N = 0
.loop:
add eax, [N] ; advance index by N
cmp eax, dword 0 ; check for end of string
je .endloop ; break out of the loop if we're done
add [N], dword 1 ; N++
jmp .loop ; loop back for next char
.endloop:
popa
mov eax, 0
leave
ret
经过一些提示和 gdb 的帮助,循环现在看起来像这样:
mov [N], dword 0 ; N = 0
.loop:
cmp [eax], byte 0 ; check for end of string
je .endloop
add eax, dword 1 ; advance index by 1 byte
add [N], dword 1 ; N++
jmp .loop
.endloop:
使用 N 来增加索引是愚蠢的。我需要增加 1.