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

时间:2015-05-04 13:49:36

标签: assembly x86

我试图编写一些可重用的程序来在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

你能解释一下问题是什么吗?

1 个答案:

答案 0 :(得分:1)

确保nav { width:100%; <<<< will resize to the max available width height:40px; font-family: Arial; margin: 0 0 10px 0; list-style: none; background-color: #000033; } 实际为您添加endp。如果它没有,请自己添加。或者,您可以使用ret作为最终通话说明,例如:

jmp