通过 nasm .asm 文件在 Dosbox 上打印“msg”

问题描述 投票:0回答:1

以下是计算字符串长度的代码,然后使用 nasm 汇编语言在 dosbox 中打印它,但它给出了逻辑错误,并且在 dosbox 上运行它后我卡住了,然后我必须重新打开它才能运行 .asm再次归档 以下是代码 组织0x0100 跳转开始

msg:db“Aurangzaib Awan”,0 消息长度:dw 0

;清屏子程序 清除屏幕: 推 es 推斧 推CX 推迪

mov ax, 0x0b800
mov es, ax
mov ax, 0x0720
mov cx, 2000
rep stosw

pop di
pop cx
pop ax
pop es
ret

;计算字符串长度的子程序 校准长度: 推BP 移动 bp, sp 推斧 推CX 推斯 推迪

mov di, [bp + 4]
mov cx, 0xffff   ; load a big num in cx
xor al, al
repne scasb
mov ax, 0xffff
sub ax, cx
dec ax
mov word [msgLen], ax

pop di
pop si
pop cx
pop ax
pop ax
pop bp
ret 2

;打印字符串的子程序 密斯特: 推BP 移动 bp, sp 推 es 推斧 推CX 推斯 推迪

mov ax, 0xb800
mov es, ax
mov ax, 80
mul byte [bp + 6] ; y pos
add ax, [bp + 8]  ; x pos
mov di, ax
mov si, [bp + 10]
mov cx, [msgLen]
mov ax, [bp + 4]  ; attribute
cld

nextChar:
    lodsb
    stosw
    loop nextChar

pop di
pop si
pop cx
pop ax
pop ax
pop es
pop bp
ret 10

开始: 调用 clrscreen mov 斧头, 味精 推斧 致电 cal_Len
mov 斧头, 味精 推斧 移动斧头,30; x 位置 推斧 移动斧头,20; y 位置 推斧 移动斧头,1;属性 推斧
打电话给mystr

    mov ax, 0x4c00
    int 0x21

我只是想让它在 dosbox 上打印消息

assembly nasm
1个回答
0
投票

该程序很容易修复

以下是错误列表:

  • cal_Lenmystr 例程都有
    pop ax
    太多。
  • 具有 4 字大小参数的 mystr 例程应通过
    ret 8
    而不是
    ret 10
    返回。
  • mystr中的属性被加载 AL 寄存器的
    lodsb
    指令覆盖。将属性移至AH:
    mov ah, [bp+4]
  • 视频缓冲区的地址计算需要将值加倍,因为对于文本屏幕中的每个字符单元,使用 2 字节:
    mov di, ax
    add di, ax
© www.soinside.com 2019 - 2024. All rights reserved.