2015-05-04 47 views
0

我试图写一个可重用的一些程序,打印x86汇编字符串:如何编写一个过程在x86程序集中打印字符串和换行符?

  • print_str:打印0结尾的字符串
  • print_nl:打印一个换行符
  • print_strnl:打印0封端的字符串,那么一个换行符

print_str工作正常,但由于某些原因,print_nlprint_strnl都进入一个无限LO运。

这里是我的代码的输出:

; 
; 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

确保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 
+0

谢谢,它现在可行!顺便说一句,你不是*杰斯特? (我曾在匈牙利的一位前同事使用过相同的绰号) –

相关问题