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

6qqygrtg  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(29)

下面是计算字符串长度的代码,然后使用nasm汇编语言在dosbox中打印它,但它在dosbox上运行后出现逻辑错误,我卡住了,然后我必须重新打开它以便再次运行.asm文件下面是代码org 0x 0100 jmp start
msg:db“Aurangzaib Awan”,0 msgLen:dw 0
;清屏子程序clrscreen:push es push ax push cx push di

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

pop di
pop cx
pop ax
pop es
ret

字符串
;计算字符串长度的子例程cal_Len:push bp mov bp,sp push ax push cx push si push di

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


;子例程打印字符串mystr:push bp mov bp,sp push es push ax push cx push si push di

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 ax,msg push ax调用cal_Len
mov ax,msg push ax mov ax,30 ; x pos push ax mov ax,20 ; y pos push ax mov ax,1 ; attribute push ax
调用mystr

mov ax, 0x4c00
    int 0x21


我只是想它打印的msg上dosbox

w1e3prcc

w1e3prcc1#

程序易于修复

以下是错误列表:

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

相关问题