关于中断调用
王爽汇编13章关于int 7ch中断的一个列子 就是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