实验任务1:
1 assume cs:code, ds:data 2 3 data segment 4 x db 1, 9, 3 5 len1 equ $ - x 6 7 y dw 1, 9, 3 8 len2 equ $ - y 9 data ends 10 11 code segment 12 start: 13 mov ax, data 14 mov ds, ax 15 16 mov si, offset x 17 mov cx, len1 18 mov ah, 2 19 s1:mov dl, [si] 20 or dl, 30h 21 int 21h 22 23 mov dl, ' ' 24 int 21h 25 26 inc si 27 loop s1 28 29 mov ah, 2 30 mov dl, 0ah 31 int 21h 32 33 mov si, offset y 34 mov cx, len2/2 35 mov ah, 2 36 s2:mov dx, [si] 37 or dl, 30h 38 int 21h 39 40 mov dl, ' ' 41 int 21h 42 43 add si, 2 44 loop s2 45 46 mov ah, 4ch 47 int 21h 48 code ends 49 end start
问题1:反汇编机器码
得到机器码 E2F2 偏移地址即为F2,求补码可得偏移地址为-14
因为Loop指令的地址是0019,s1开始的地址是000D,Loop指令地址加上指令长度减去s1的地址,偏移量就是-14
问题2:反汇编机器码
得到机器码 E2F0,偏移量为F0,求补码可得偏移量为-16、
问题3:问题1的截图: 问题2的截图:
实验任务2:
问题1:
1 assume cs:code, ds:data 2 3 data segment 4 dw 200h, 0h, 230h, 0h 5 data ends 6 7 stack segment 8 db 16 dup(0) 9 stack ends 10 11 code segment 12 start: 13 mov ax, data 14 mov ds, ax 15 16 mov word ptr ds:[0], offset s1 17 mov word ptr ds:[2], offset s2 18 mov ds:[4], cs 19 20 mov ax, stack 21 mov ss, ax 22 mov sp, 16 23 24 call word ptr ds:[0] 25 s1: pop ax 26 27 call dword ptr ds:[2] 28 s2: pop bx 29 pop cx 30 31 mov ah, 4ch 32 int 21h 33 code ends 34 end start
猜想:AX=0021 BX=0026 CX=???
Debug结果:
思考:
当执行 call指令时,先把当前的IP存起来,当前IP指向下一条命令,地址为0021,于是0021入栈,接着执行POP AX,于是AX的值就是0021
接着执行call指令,IP指向下一条指令的地址为0026.于是0026入栈,接着执行POP BX. 接着执行POP CX,但此时栈为空,不知道为什么CX的值为076C。
实验任务3:
实验任务5:
1 assume ds:data, cs:code 2 3 data segment 4 stu_no db '201983290431' 5 len = $ - stu_no 6 data ends 7 8 code segment 9 start: 10 mov ax,data 11 mov ds,ax 12 13 mov si,0 14 mov cx,07D0h; 15 mov bh,0 16 mov bl,00010111B;对应蓝底白字 17 call printK 18 mov si,0 19 mov cx,004Fh; 20 mov bh,24 ;绿色字符显示在第24行 21 mov bl,00010111B;对应蓝底白字 22 call printF 23 mov si,0 24 mov cx,len;字符串长度为len赋值给cx 25 mov bh,24 ;绿色字符显示在第24行 26 mov bl,00010111B;对应蓝底白字 27 call printStr 28 29 30 mov ax,4c00h 31 int 21h 32 33 34 printStr: 35 mov ax,0b800h ;80*25字符缓冲区 36 mov es,ax 37 38 mov al,bh 39 mov bh,0a0h ;一行是160个字节,即a0.总共偏移24行,即24*160个字节 40 mul bh ;mul默认al和mul后面的寄存器相乘,结果放在ax中 41 add ax,4ah 42 mov bp,ax 43 s: 44 mov ah,ds:[si];每次取出一个字节给ah 45 mov es:[bp],ah;把字母存给显存地址低八位中 46 inc bp 47 mov es:[bp],bl;将颜色信息存入高八位 48 inc bp 49 inc si 50 loop s 51 ret 52 53 printF: 54 mov ax,0b800h ;80*25字符缓冲区 55 mov es,ax 56 57 mov al,bh 58 mov bh,0a0h ;一行是160个字节,即a0.总共偏移24行,即24*160个字节 59 mul bh 60 mov bp,ax 61 s1: 62 mov ah,'-';每次取出一个字节给ah 63 mov es:[bp],ah;把字母存给显存地址低八位中 64 inc bp 65 mov es:[bp],bl;将颜色信息存入高八位 66 inc bp 67 inc si 68 loop s1 69 ret 70 71 printK: 72 mov ax,0b800h ;80*25字符缓冲区 73 mov es,ax 74 75 mov al,bh 76 mov bh,0a0h ;一行是160个字节,即a0.总共偏移24行,即24*160个字节 77 mul bh 78 mov bp,ax 79 s2: 80 mov ah,' ';每次取出一个字节给ah 81 mov es:[bp],ah;把字母存给显存地址低八位中 82 inc bp 83 mov es:[bp],bl;将颜色信息存入高八位 84 inc bp 85 inc si 86 loop s2 87 ret 88 89 90 91 code ends 92 end start