下面是计算字符串长度的代码,然后使用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
1条答案
按热度按时间w1e3prcc1#
程序易于修复
以下是错误列表:
pop ax
。ret 8
而不是ret 10
返回。lodsb
指令覆盖。将属性移动到AH:mov ah, [bp+4]
。mov di, ax
add di, ax
。