我很久以前写了一个代码来获取用户输入并在屏幕上打印。现在,我需要将其用于8088汇编程序并面临困难。在我看来像汇编程序问题,所以请指导我。
org 100h
.data
var1 db 100 dup("$")
.code
inputString proc
mov ax,@data
mov ds,ax
mov si,offset var1
l1:
mov ah,1
int 21h
cmp al,13
je printString
mov [si],al
inc si
jmp l1
printString:
mov dx, offset var1
mov ah,9
int 21h
mov ah,4ch
int 21h
inputString endp
end inputString
ret
> 8086 和 8088 是二进制兼容的。 唯一的区别是 8088 具有 8 位内存总线而不是 16 位,因此内存访问速度较慢。 根据维基百科,CPU的执行核心部分实际上与晶体管布局相同,只是总线接口单元不同。
8088 指令预取队列是 4 个字节,而不是 8086 中的 6 个字节,这实际上可能是一种优化,以减少使用较慢总线的分支之外浪费的预取。 另请参阅此逆向计算问答,了解指令计时和性能信息。
如果您遇到麻烦,您正在测试的 8088 可能运行的 DOS 版本与您的 8086 或其他版本不同。 (您的软件使用 DOSint 21h
系统调用,因此它只能在过时的操作系统或现代模拟器/兼容层下工作)。
COM
可执行文件(org 100h
)不需要设置DS
:程序加载器在跳转到入口点之前将所有段寄存器设置为相同。
org 100h .data var1 db 100 dup("$") .code
你确定你正在使用的汇编程序知道数据应该遵循代码,因为在.COM程序中,执行总是从顶部开始。
试试这个版本:
org 100h
mov si,offset var1
l1:
mov ah,1
int 21h
cmp al,13
je printString
mov [si],al
inc si
jmp l1
printString:
mov dx, offset var1
mov ah,9
int 21h
mov ax,4C00h
int 21h
var1 db 100 dup("$")