汇编程序使用字符串

时间:2017-05-10 16:37:22

标签: assembly masm

任务:

制作程序,显示最后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

谢谢。

1 个答案:

答案 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个字符”不需要这个,该字符串已准备好按原样打印在内存中,只需移动一开始。