[英]How to write a procedure to print a string and a newline character in x86 assembly?
我正在尝试编写一些可重用的过程以在x86汇编中打印字符串:
print_str
:打印以0结尾的字符串 print_nl
:打印换行符 print_strnl
:打印一个以0结尾的字符串,然后输出一个换行符 print_str
可以正常工作,但是由于某些原因, print_nl
和print_strnl
都进入无限循环。
这是我的代码和输出:
;
; String handling
;
code segment para public 'CODE'
assume cs:code ds:data ss:stack es:nothing
main proc far
push ds
xor ax, ax
push ax
mov ax, data
mov ds, ax
mov si, offset t_something
cld
call print_nl
ret
main endp
;
; Print a 0-terminated string
;
; Parameters:
; - SI: the offset of the string
;
print_str proc
print_str_start:
lodsb
cmp al, 0
je print_str_end
mov ah, 14
int 10h
jmp print_str_start
print_str_end:
ret
print_str endp
;
; Print a newline character
;
print_nl proc
mov si, offset t_newline
cld
call print_str
print_nl endp
;
; Print a 0-terminated string, then a newline character
;
; Parameters:
; - SI: the offset of the string
;
print_strnl proc
call print_str
call print_nl
print_strnl endp
data segment para public 'DATA'
t_newline db 13, 10, 0
t_something db 'SOMETHING', 0
data ends
stack segment para stack
dw 100 DUP (?)
stack ends
end main
输出:
SOMETHING
SOMETHING
SOMETHING
SOMETHING
SOMETHING
SOMETHING
SOMETHING
(...) - infinite loop
您能解释一下是什么问题吗?
确保endp
实际上为您添加了一个ret
。 如果没有,请自行添加。 或者,您可以仅使用jmp
作为最终通话说明,例如:
;
; Print a newline character
;
print_nl proc
mov si, offset t_newline
cld
jmp print_str
print_nl endp
;
; Print a 0-terminated string, then a newline character
;
; Parameters:
; - SI: the offset of the string
;
print_strnl proc
call print_str
jmp print_nl
print_strnl endp
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.