如何编写程序在 x86 汇编中打印一个字符串和一个换行符?

How to write a procedure to print a string and a newline character in x86 assembly?

我正在尝试编写一些可重用的程序来在 x86 程序集中打印字符串:

print_str 工作正常,但由于某种原因,print_nlprint_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