assembly - 如何替换 Nasm 程序中的特定字符
问题描述
我想用 '#' 字符替换 dbyte 中的空格,并且 db 应该通过堆栈传递给过程。
我已经编写了下一个片段并且替换正在工作,但我不明白如何func
正确地将 db 传递给过程。
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 位代码,因此数组作为一个字被推送。ret 4
应该ret 2
是。请注意,您的数组实际上是一个以零结尾的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]
这有用吗?它只是为随后的程序终止加载返回地址。
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
推荐阅读
- flutter - 在 Future Builder 中全屏显示圆形进度条
- javascript - 有没有办法将索引数组传递给 mongodb 并从该索引处的数组中获取元素
- java - 如何在 Apache Beam Java SDK 中的多个列上使用 aggregateField()?
- angular - 使用按钮逐级展开和折叠 PrimeNG TreeTable
- python - 使用 cpickle 写入文件
- java - RSA Java 投诉签名和验证
- apache-spark - PySpark Cassandra 数据库连接问题
- powerbi - 如何使用时间变量增强组合代码
- python-3.x - 在数据框中循环应用程序以查找输出
- flutter - Flutter 中的依赖注入——不同方法的影响