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

Assembly 8086 code to 8088 compatible conversion - Assembler Error

我很久以前写了一个代码来获取用户输入并在屏幕上打印。现在,我需要将它用于 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 位内存总线,因此内存访问速度较慢。 According to Wikipedia,CPU 的执行核心部分在晶体管布局上完全相同,只是总线接口单元不同。

The 8088 instruction prefetch queue is 4 bytes instead of 6 in 8086, which may actually have been an optimization to reduce wasted prefetch beyond branches with the slower bus. See also this retrocomputing Q&A 用于指令时序和性能信息。


如果您 运行 遇到麻烦,您正在测试的 8088 可能 运行 与您的 8086 或其他东西不同的 DOS 版本。 (您的软件正在使用 DOS int 21h 系统调用,因此它只能在过时的 OS 或现代仿真器/兼容层下运行。

COM可执行文件(org 100h)不需要设置DS:程序加载器在跳转到入口点之前将所有段寄存器设置为相同。

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