【问题标题】:Assembler Work With Strings汇编器使用字符串
【发布时间】:2017-05-10 16:37:21
【问题描述】:

一个任务:

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

谢谢。

【问题讨论】:

    标签: assembly masm


    【解决方案1】:

    “更胖” - 国际大会语言委员会不同意这一点,并且认为持续节食相当成功。

    要使值47,20,27 在代码中的硬连线更少,请尽量减少它们在代码中的使用。


    mov ecx,LENGTHOF Original_string
    

    是输入参数,即使你从用户那里获取输入字符串,这样的东西也会一直存在(那么你将不得不调用某种strlen 函数而不是mov ecx,<number>)。 = 好的


    sub ecx, 27                     ;47-20 =17
    

    27 与“显示最后 20 个字符”任务无关,以其他方式执行。


    mov esi,[OFFSET Original_string]+27
    

    字符串开头的地址也是输入参数,并且在某种形式下它必须提供给编码,但是+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 个字符来修改原始字符串,或者逐个字符地输出它(例如int 21h,ah=2)并计数 20,或将其复制到内存中到 Formed_line 并添加终止符,但“最后 20 个字符”不需要这些,该字符串已准备好按原样打印在内存中,只需移动开头。

    【讨论】:

    • 现在我担心lea edx,[esi+ecx-20] 在 16b 实模式下不可用,所以你需要使用bx 而不是ecx,因为lea dx,[si+bx-20] 是 即使在 16b 实模式下也是合法的,或者您可以通过单独的指令进行计算:mov dx,siadd dx,cxsub dx,20
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多