assembly 程序集8086,有没有办法存储输入的每一行的一半字节,然后打印这些行的前一半?

x33g5p2x  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(111)

我是汇编编程的新手,在这个问题上我卡住了相当长的一段时间。我的程序应该从输入中取行,并打印前半行的前半个字节作为返回。
当我尝试使用以下输入运行代码时:

first line
second line
third line
fourth line

我收到这个:

冷杉
虽然这是我应该得到的东西:
第一次(10//2)
第二次(11//2)
我想我可以一行一行地读,缩短它,然后保存它的最后长度,然后从我存储它的地方读它,然后用cnt_lns作为计数器打印它们的前半部分。
这是我的想法:

cpu 8086
segment extra
buffer resb 60000

segment code
..start mov bx, data
        mov ds, bx
        mov bx, stack
        mov ss, bx
        mov sp, dno
    mov bx, extra
    mov es, bx

read_lines:
        mov ah, 0x0a
        mov dx, read
        int 21h
        jz print_lines

        mov cx, [cnt_lns]
        inc cx
        mov [cnt_lns], cx

    
    
shorten_lines:
        mov bx, 0
        mov bl, byte [read + 1]
    mov bh, 0
        shr bx, 1
    
    mov [line + bx], byte 13
    mov [line + bx + 1], byte 10
    inc bx

    mov [line_ln], bx
    mov cx, bx
    
    mov bx, buffer
    add bx, [total_len]
    mov si, line
    mov di, bx
    rep movsb
    
    mov bx, [line_ln]
    add [total_len], bx
    
print_lines:
    mov cx, [total_len]
    mov bx, 0
cycle:
    mov ah, 2
    mov dl, [buffer + bx]
    int 21h
    inc bx
    dec cx
    jnz cycle
    
done: hlt

segment data
read        db  100, ?
line        resb 100

line_ln     db    0

cnt_lns     dw    0
total_len   dw    0

segment stack
        resb 16
dno:    db ?

我将非常感谢任何帮助或解释。谢谢大家!〈3

p5fdfcr1

p5fdfcr11#

您无法在emu 8086上运行此NASM代码!

在emu 8086中,像mov dx, read这样的指令不会加载DX中输入结构的地址,而是从内存中加载一个字。所以这不是你所需要的。这归结为DOS执行一个输入并将结果存储在你所期望的地方之外。
DOS.BufferedInput函数0Ah未返回任何标志。因此,操作零标志(jz print_lines)将产生意外结果。
在 * shortend_lines* 中,你添加了回车和换行字节,你只给BX加了1,这是不够的,因为你会再次丢失换行字节。
只有16字节的堆栈太小了,不能正常工作,正常的堆栈大小是256字节,但是不要害怕把它做得更大,比如说1024。
溶液
我不会选择使用DOS.BufferedInput函数0Ah来解决这个任务。即使你失去了它(有限的)编辑功能,Peter Cordes在评论中描述的方法也更容易理解和实现。如果你表现出兴趣,我可能会编写它...看起来很有趣。

相关问题