![]() |
#2
有容就大2012-08-18 20:58
|
就是ax里有一个数 然后用写一个7ch中断来求他的平方
我基本照书复制了一个中断 程序能运行 但是调用后 在屏幕上什么都没显示
我去掉中断 直接在mov ax, 2345后面 写mul ax 运行后就能在屏幕上显示正确的结果:2 * 2345^2 = 10998050
下面是代码 还是不知道是中断写的有问题 还是 调用的时候有问题
代码比较长 但几个子函数:show_str, divdw, dtoc基本不用看 应该没问题
各位看官就帮看下start后面的中断和main的衔接是否正常。

;#Mode=DOS
;MASMPlus 单文件代码模板 - 纯 DOS 程序
;--------------------------------------------------------------------
;单个文件需要指定编译模式,否则默认是EXE方式,在系统设置中可以设置默认是DOS还是Windows.
;编译模式自带了DOS/COM/CON/EXE/DLL/LIB这几种,如果有必要,可以更改ide.ini添加新的编译模式
;当然,更好的是创建为一个工程.更方便及易于管理,使用方法:按Ctrl多选->创建工程.必须有多个文件
assume cs:code, ds:data
data segment
db 20 dup(0)
data ends
code segment
start: mov bx, cs
mov ds, bx
mov si, offset sqr
mov bx, 0
mov es, bx
mov di, 200h
mov cx, offset sqrend - offset sqr
cld
rep movsb
mov bx, 0
mov es, bx
mov WORD ptr es:[7ch * 4], 200h
mov WORD ptr es:[7ch * 4 + 2], 0
mov ah, 1
int 21h
mov ax, 4c00h
int 21h
sqr: mul ax
iret
sqrend: nop
main: mov ax, data
mov ds, ax
mov ax, 2345
int 7ch
;mul ax ; 曾经试过直接求平方 可以得到正确的结果
add ax, ax
adc dx, dx
mov si, 0 ; 指向数据段首地址
call dtoc ; 平方后翻倍 并把结果转化为字符串 放到data中
mov dh, 9
mov dl, 3
mov cl, 2
mov si, 0
call show_str ; 显示字符串
mov ah, 1
int 21h
mov ax, 4c00h
int 21h
dtoc: push ax
push bx
push cx
push dx
push si
push di
mov di, 0
d20: mov cx, 10
call divdw ; 呼叫不溢出除法
add cx, 30h
push cx
inc di
mov cx, ax
jcxz d21
jmp d20
d21: mov cx, dx
jcxz d22
jmp d20
d22: mov cx, di
d23: pop ax
mov [si], al
inc si
loop d23
mov al, 0
mov [si], al
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
divdw:
push bx
push si
push ax
mov ax, dx
mov dx, 0
div cx
mov si, ax
pop ax
div cx
mov cx, dx
mov dx, si
pop si
pop bx
ret
show_str: push ax
push bx
push es
mov ax, 0b800h
mov es, ax
mov ax, 160
mul dh
mov bx, ax
mov ax, 2
mul dl
add bx, ax
mov al, cl
mov cl, 0
show1: mov ch, [si]
jcxz show2
mov es:[bx], ch
mov es:[bx].1, al
add bx, 2
inc si
jmp show1
show2: pop es
pop bx
pop ax
ret
code ends
end start
;MASMPlus 单文件代码模板 - 纯 DOS 程序
;--------------------------------------------------------------------
;单个文件需要指定编译模式,否则默认是EXE方式,在系统设置中可以设置默认是DOS还是Windows.
;编译模式自带了DOS/COM/CON/EXE/DLL/LIB这几种,如果有必要,可以更改ide.ini添加新的编译模式
;当然,更好的是创建为一个工程.更方便及易于管理,使用方法:按Ctrl多选->创建工程.必须有多个文件
assume cs:code, ds:data
data segment
db 20 dup(0)
data ends
code segment
start: mov bx, cs
mov ds, bx
mov si, offset sqr
mov bx, 0
mov es, bx
mov di, 200h
mov cx, offset sqrend - offset sqr
cld
rep movsb
mov bx, 0
mov es, bx
mov WORD ptr es:[7ch * 4], 200h
mov WORD ptr es:[7ch * 4 + 2], 0
mov ah, 1
int 21h
mov ax, 4c00h
int 21h
sqr: mul ax
iret
sqrend: nop
main: mov ax, data
mov ds, ax
mov ax, 2345
int 7ch
;mul ax ; 曾经试过直接求平方 可以得到正确的结果
add ax, ax
adc dx, dx
mov si, 0 ; 指向数据段首地址
call dtoc ; 平方后翻倍 并把结果转化为字符串 放到data中
mov dh, 9
mov dl, 3
mov cl, 2
mov si, 0
call show_str ; 显示字符串
mov ah, 1
int 21h
mov ax, 4c00h
int 21h
dtoc: push ax
push bx
push cx
push dx
push si
push di
mov di, 0
d20: mov cx, 10
call divdw ; 呼叫不溢出除法
add cx, 30h
push cx
inc di
mov cx, ax
jcxz d21
jmp d20
d21: mov cx, dx
jcxz d22
jmp d20
d22: mov cx, di
d23: pop ax
mov [si], al
inc si
loop d23
mov al, 0
mov [si], al
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
divdw:
push bx
push si
push ax
mov ax, dx
mov dx, 0
div cx
mov si, ax
pop ax
div cx
mov cx, dx
mov dx, si
pop si
pop bx
ret
show_str: push ax
push bx
push es
mov ax, 0b800h
mov es, ax
mov ax, 160
mul dh
mov bx, ax
mov ax, 2
mul dl
add bx, ax
mov al, cl
mov cl, 0
show1: mov ch, [si]
jcxz show2
mov es:[bx], ch
mov es:[bx].1, al
add bx, 2
inc si
jmp show1
show2: pop es
pop bx
pop ax
ret
code ends
end start