我是汇编编程的新手,在这个问题上我卡住了相当长的一段时间。我的程序应该从输入中取行,并打印前半行的前半个字节作为返回。
当我尝试使用以下输入运行代码时:
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
1条答案
按热度按时间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在评论中描述的方法也更容易理解和实现。如果你表现出兴趣,我可能会编写它...看起来很有趣。