奥普瓯江 发表于 2019-3-12 11:34:10

检测点13.1

本帖最后由 奥普瓯江 于 2019-3-12 11:33 编辑

(1)在上面的内容中,我们用7ch中断例程实现loop的功能,则上面的7ch中断例程所能进行的最大转移位移是多少?
答:最大的转移位移是FFFFH,个人判断,bx能储存的最大16位数就是他能储存的最大位移。



(2)用7ch中断例程完成jmp near ptr s 指令的功能,用bx向中断例程传送转移位移。


assume cs:code, ds:data

data segment
                db 'conversation', 0
data ends

code segment
start:
                mov ax, data
                mov ds, ax
                mov si, 0
                mov ax, 0b800h
                mov es, ax
                mov di, 12*160
s:
                cmp byte ptr , 0
                je ok                        ;如果是0跳出循环
                mov al,
                mov es:, al
                inc si
                add di, 2
                mov bx, offset s-offset ok                ;设置从标号ok到标号s的转移位移
                int 7ch                                                        ;转移到标号s处
ok:
                mov ax, 4C00h
                int 21h
               
code ends
end start


答:以下为模拟 jmp near ptr s 命令的int 7ch程序

assume cs:code

code segment
start:                                                                                        ;寻找到原始数据地址
                mov ax, cs
                mov ds, ax
                mov si, offset text_1
               
                mov ax, 0                                                                ;定位目标地址
                mov es, ax
                mov di, 200h
               
                mov cx, offset text_2 - offset text_1                 ;计算数据数量rep movsb循环所用
               
                cld                                                                                        ;累加循环
                rep movsb
                                                                                                        ;镶入中断7Ch中
                mov ax, 0
                mov es, ax
                mov word ptr es:, 200h
                mov word ptr es:, 0h
               
                mov ax, 4c00h
                int 21h
text_1:                                                                        ;数据段
                push bp                                                        ;临时调用bp所以需要把前期的数据先放入站中储存
                mov bp, sp
                add word ptr ss:, bx                ;直接在栈中更改数据,bp默认的段寄存器是ss
                pop bp                                                        ;放入站中临时储存的bp数据释放出来
                iret
text_2:
                nop                                        ;只是为了占位所以设置的本标致供cx计算使用
code ends
end start

燃烧的飞星 发表于 2019-12-26 17:35:33

第一题
位移有方向的,应该是用补码表示吧
如果是补码那就是-30768~30761

奥普瓯江 发表于 2020-1-2 10:30:51

燃烧的飞星 发表于 2019-12-26 17:35
第一题
位移有方向的,应该是用补码表示吧
如果是补码那就是-30768~30761

你那是10进制的我这是16进制的,16进制的范围为0000-FFFF,内存表示无正负数,只有地址,你这种表示也对的
页: [1]
查看完整版本: 检测点13.1