繁体   English   中英

如何编写在x86程序集中打印字符串和换行符的过程?

[英]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_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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM