任务:
制作程序,显示最后20个字符。 我做了但是,编程工作只有47长度字符串。 如何使用任意长度的线来制作通用程序。
MASM:
.model small
.stack 100h
.data
Original_string db 'Assembler language is the fatster in the world.',13,10,'$'
Formed_line db 255 DUP(?)
.code
.386
main:
mov ax,@data;
mov ds,ax;
mov es,ax;
mov dx,offset Original_string
mov ah, 9
int 21h
cld
mov ecx,LENGTHOF Original_string
sub ecx, 27 ;47-20 =17
mov esi,[OFFSET Original_string]+27
mov edi,OFFSET Formed_line
rep movsb
mov dx,offset Formed_line
mov ah,9
int 21h
mov ax,4C00h
int 21h
end main
谢谢。
答案 0 :(得分:0)
“fatster” - 国际大会语言委员会不赞成这一点,而且正在进行的饮食被认为是相当成功的。
要使代码中的值47,20,27
不那么硬连线,请尽量减少它们在代码中的使用。
mov ecx,LENGTHOF Original_string
是输入参数,类似这样的东西将始终存在,即使你从用户那里获取输入字符串(然后代替mov ecx,<number>
你必须调用某种strlen
函数)。 =好的
sub ecx, 27 ;47-20 =17
27与任务“显示最后20个字符”无关,请以其他方式执行。
mov esi,[OFFSET Original_string]+27
字符串start的地址又是输入参数,并且在某种形式下它必须以任何方式提供给代码,但+27也是一些硬编码的中间值。
基本上你应该能够用这个输入完成任务(开始序列,在屏幕上显示字符串后):
mov esi,OFFSET Original_string
mov ecx,LENGTHOF Original_string
每个进一步的代码应该只重用那些参数值,永远不要再使用Original_string
标签,只使用20
常量(因为任务是“最后20个字符”)。尝试从这3个基本值计算所需的每个其他中间值(保留您必须多次访问的值的副本)。
实际上,从原始字符串打印最后20个字符,这些输入比人们预期的要容易。由于字符串最后已由'$'
终止,您可以:
lea edx,[esi+ecx-20]
mov ah, 9
int 21h
完成。 esi+ecx
是字符串end()
的地址('$'
之后的第一个字节),然后-20会将地址移回20个字符。
实际上你应该做-21,因为'$'
不是字符串的字符,而是字符串终止符。所以-20只显示19个字符(包括<EOL>
个字符)。
对于采用任何输入的通用算法,您应首先测试,如果ecx
至少为21+,则对于较短/空字符串,-21地址将超出字符串。
如果你必须显示前20个字符,那么你需要通过用'$'
终结符销毁它的第21个字符来修改原始字符串,或者输出char-by-char({{1}例如)和计数20,或将其在内存中复制到int 21h,ah=2
并添加终结符,但“最后20个字符”不需要这个,该字符串已准备好按原样打印在内存中,只需移动一开始。