汇编8086代码到8088兼容转换 - 汇编程序错误

时间:2018-01-14 15:16:51

标签: assembly x86-16

我很久以前就编写了一个代码来获取用户输入并在屏幕上打印。现在,我需要将它用于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

2 个答案:

答案 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("$")