我正在尝试构建一个汇编代码,它要求一个字符串,从字符串打印的位置开始,以及要打印的所需长度。 假设开始和长度始终有效您能否帮我确定开始和长度。
它应该如何运作:
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
答案 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