我很久以前就编写了一个代码来获取用户输入并在屏幕上打印。现在,我需要将它用于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
答案 0 :(得分:5)
8086和8088是二进制兼容的。唯一的区别是8088有一个8位内存总线而不是16位,因此内存访问速度较慢。 According to Wikipedia,CPU的执行核心部分与晶体管布局完全相同,只有总线接口单元不同。
The 8088 instruction prefetch queue is 4 bytes instead of 6 in 8086,这可能实际上是一种优化,以减少浪费的预取超出分支与较慢的总线。另请参阅this retrocomputing Q&A了解指令时间和穿孔信息。
如果你遇到麻烦,你正在测试的8088可能运行的是与8086不同的DOS版本。 (您的软件正在使用DOS int 21h
系统调用,因此它仅适用于过时的操作系统或现代仿真器/兼容性层。)
COM
可执行文件(org 100h
)不需要设置DS
:程序加载器在跳转到入口点之前将所有段寄存器设置为相同。
答案 1 :(得分:2)
org 100h .data var1 db 100 dup("$") .code
您确定您使用的汇编程序知道DATA应该遵循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("$")