使用开始和长度汇编语言打印字符串

时间:2016-08-28 09:03:23

标签: assembly x86 dos tasm x86-16

我正在尝试构建一个汇编代码,它要求一个字符串,从字符串打印的位置开始,以及要打印的所需长度。 假设开始和长度始终有效您能否帮我确定开始和长度。

它应该如何运作:

Enter String: Hello World
Enter Start: 3
Enter Length: 5
Mid-String: llo W

所以我对如何确定字符串的开头和长度有疑问。我尝试了以下代码中显示的几件事:

.model small
.stack
.data
msg1 db "Enter String:$"
msg2 db 13,10,"Enter Start:$"
msg3 db 13,10,"Enter Length:$"
msg4 db 13,10,"Mid-String:$"
nwln db 13,10
mySample label byte
maxlen db 10
actlen db 0
string db 19 dup (?)
.code
mov ax,@data
mov ds,ax
    lea dx, msg1 ;print msg1
    mov ah,9
    int 21h

    lea dx,mySample ;accept string
    mov ah,0Ah
    int 21h

    mov bh,0
    mov bl,maxlen
    mov string[bx],'$'
    mov ah,9
    lea dx,string   ;print string accept
    int 21h

    lea dx, msg2    ;print msg2 and accept start
    mov ah,9
    int 21h
    mov ah,1
    int 21h
    sub al,30h
    mov bh,0
    mov bl,al

    lea dx, msg3    ;print msg3 and accept length
    mov ah,9
    int 21h
    mov ah,1
    int 21h
    sub al,30h
    mov dl,al

    ;mov maxlen,dl
    mov bh,0
    mov bl,maxlen
    mov string[bx],'$'
    lea dx,msg4     ;print msg4
    mov ah,9
    int 21h
    lea dx,string   ;print mid-string
    int 21h
mov ah,4ch
int 21h
END

OUTPUT LOOKS LIKE: output from the code above

2 个答案:

答案 0 :(得分:1)

基于快速查看最后几条指令,您实际执行偏移和打印(假设其余代码只是正确打印和读取字符串):

您忘记将ASCII转换为整数,因此您要在字符串末尾($)之前写入终止'0'多个字节:0的ASCII编码)。

您似乎也没有使用起始偏移量。在将lea dx, [string + bx]收入BX后,可以很容易地执行atoi(start_offset_string)之类的操作。

您的长度从原始字符串的开头开始计算,而不是从偏移位置开始计算。你可能想先做偏移。

答案 1 :(得分:0)

我对你的代码进行了一些小改动以使其工作,这些小改动被评论,基本上,这是一个正确使用指针(指向起始位置和长度)的问题,我用寄存器{{1}代替}和if convert_to == "dollars": amount *= 1.3 elif convert_to == "euros": amount *= 1.17 elif convert_to == "yen": amount *= 133.66 else: print "You must pick either dollar, euro or yen."

SI