如何替换 Nasm 过程中的特定字符
How to replace specific character in Nasm procedure
我想用“#”字符替换 dbyte 中的空格,并且
db 应该通过堆栈传递给过程。
我已经编写了下一个片段并且替换工作正常,但我无法理解如何将数据库正确传递给过程 func
。
org 0x100
push array
call func
mov bp, sp
mov bx, [bp]
ret
loop:
mov al, byte[bx+si]
cmp al, 0
jz func
cmp al , ' '
jnz loop
mov byte[bx+si], '#'
inc si
jmp loop
ret
func:
push bp
mov bp, sp
mov bx, [bp + 4]
call loop
mov [bp + 4], bx
pop bp
ret 4
array db "a b c", 0
几个问题
push array
call func
;
ret 4
这是 16 位代码,因此 array 被作为一个字推送。 ret 4
应该改为 ret 2
。请注意,您的 array 实际上是 zero-terminated string.
mov al, byte[bx+si]
如果你没有事先清除SI
,这将无法工作。
cmp al, 0
jz func
您正在使用您 call
编写的代码。你不应该像这样跳回调用者!
cmp al , ' '
jnz loop
跳到顶部错过了 SI
上的增量。
mov [bp + 4], bx
这是多余的,因为参数没有被修改。而且你无论如何都要丢弃它。
mov bp, sp
mov bx, [bp]
这个有用吗?它只是为随后的程序终止加载 return 地址。
ret
这种终止程序的方式依赖于正确的堆栈。情况并非总是如此! DOS 程序最好通过以下方式终止:
mov ax, 4C00h
int 21h
放在一起
org 256
push MyString
call Func
mov bp, sp
mov bx, [bp]
mov ax, 4C00h ;Program termination
int 21h
Loop:
mov al, byte[bx+si]
cmp al, 0
je EndOfLoop
cmp al, ' '
jne NotASpace
mov byte[bx+si], '#'
NotASpace:
inc si
jmp Loop
EndOfLoop:
ret
;Clobbers AL, BX, SI
Func:
push bp
mov bp, sp
mov bx, [bp + 4]
xor si, si
call Loop
pop bp
ret 2
MyString db "a b c", 0
我想用“#”字符替换 dbyte 中的空格,并且 db 应该通过堆栈传递给过程。
我已经编写了下一个片段并且替换工作正常,但我无法理解如何将数据库正确传递给过程 func
。
org 0x100
push array
call func
mov bp, sp
mov bx, [bp]
ret
loop:
mov al, byte[bx+si]
cmp al, 0
jz func
cmp al , ' '
jnz loop
mov byte[bx+si], '#'
inc si
jmp loop
ret
func:
push bp
mov bp, sp
mov bx, [bp + 4]
call loop
mov [bp + 4], bx
pop bp
ret 4
array db "a b c", 0
几个问题
push array call func ; ret 4
这是 16 位代码,因此 array 被作为一个字推送。 ret 4
应该改为 ret 2
。请注意,您的 array 实际上是 zero-terminated string.
mov al, byte[bx+si]
如果你没有事先清除SI
,这将无法工作。
cmp al, 0 jz func
您正在使用您 call
编写的代码。你不应该像这样跳回调用者!
cmp al , ' ' jnz loop
跳到顶部错过了 SI
上的增量。
mov [bp + 4], bx
这是多余的,因为参数没有被修改。而且你无论如何都要丢弃它。
mov bp, sp mov bx, [bp]
这个有用吗?它只是为随后的程序终止加载 return 地址。
ret
这种终止程序的方式依赖于正确的堆栈。情况并非总是如此! DOS 程序最好通过以下方式终止:
mov ax, 4C00h
int 21h
放在一起
org 256
push MyString
call Func
mov bp, sp
mov bx, [bp]
mov ax, 4C00h ;Program termination
int 21h
Loop:
mov al, byte[bx+si]
cmp al, 0
je EndOfLoop
cmp al, ' '
jne NotASpace
mov byte[bx+si], '#'
NotASpace:
inc si
jmp Loop
EndOfLoop:
ret
;Clobbers AL, BX, SI
Func:
push bp
mov bp, sp
mov bx, [bp + 4]
xor si, si
call Loop
pop bp
ret 2
MyString db "a b c", 0