汇编语言第三次实验
1. 实验任务1
- task1源码
1 assume cs:code, ds:data 2 3 data segment 4 x db 1, 9, 3 5 len1 equ $ - x ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是3 6 7 y dw 1, 9, 3 8 len2 equ $ - y ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是9 9 data ends 10 11 code segment 12 start: 13 mov ax, data 14 mov ds, ax 15 16 mov si, offset x ; 取符号x对应的偏移地址0 -> si 17 mov cx, len1 ; 从符号x开始的连续字节数据项个数 -> cx 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 ; 取符号y对应的偏移地址3 -> si 34 mov cx, len2/2 ; 从符号y开始的连续字数据项个数 -> cx 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
跳转的位移量是-14,编译器通过标号处的地址-loop指令后的第一个字节的地址计算跳转的8位位移,此例中标号s1的偏移地址为000D,loop指令后第一个字节的偏移地址为001B,两者相减结果为-14。
- 问题2
跳转的位移量是-10,标号s2的偏移地址为0029,loop指令后第一个字节的偏移地址为0039,两者相减结果为-10。包括loop指令在内的所有循环指令都是短转移,在对应机器码中包含转移位移而非地址。
- 反汇编截图

2. 实验任务2
- task2源码
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
- 分析结果
源程序line24将下一行指令在内存中的偏移地址(IP)入栈,并将IP的内容修改为内存ds:[0]处字的内容。此前已将标号s1的偏移地址(offset s1)存至ds:[0]处,因此这条call指令执行后跳转至标号s1处执行。s1处的指令将栈顶数据,即line25 pop指令在内存中的偏移地址(IP)出栈并存入寄存器ax中。
line27 call指令将下一行指令在内存中的段地址(CS)和偏移地址(IP)相继入栈,并将CS和IP的内容修改为内存ds:[2]处双字的内容。此前将标号s2的偏移地址(offset s2)存至ds:[2]处,将段地址(CS)存放在ds:[4]处,因此这条call指令执行后跳转至标号s2处执行。标号s1之后的指令将栈顶数据(IP)出栈并存入寄存器bx中,在将栈顶数据(CS)出栈并存入寄存器cx中。
结论:ax中存放了标号s1处指令在内存中的偏移地址,bx中存放了标号s2处指令在内存中的偏移地址,cx中存放了标号s2处指令在内存中的段地址。
- 调试验证

反汇编后观察标号s1、s2处指令的地址

调试所得结果与分析相同。
3. 实验任务3
- task3源码
1 assume cs:code, ds:data 2 data segment 3 x db 99, 72, 85, 63, 89, 97, 55 4 len equ $- x 5 data ends 6 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 mov si, offset x 12 mov cx, len 13 s:mov ah, 0 14 mov al, [si] 15 mov dl, 10 16 div dl 17 mov bx, ax 18 mov ah, 2 19 call printNumber 20 call printSpace 21 inc si 22 loop s 23 mov ah, 4ch 24 int 21h 25 26 printNumber: 27 mov dl, bl 28 or dl, 30h 29 int 21h 30 mov dl, bh 31 or dl, 30h 32 int 21h 33 ret 34 printSpace: 35 mov dl, ' ' 36 int 21h 37 ret 38 code ends 39 end start
- 运行测试

4. 实验任务4
- task4源码
1 assume cs:code, ds:data 2 data segment 3 str db 'try' 4 len equ $ - str 5 data ends 6 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 12 mov si, offset str 13 mov bh, 0 14 mov bl, 2 15 call printStr 16 17 mov si, offset str 18 mov bh, 24 19 mov bl, 4 20 call printStr 21 22 mov ah, 4ch 23 int 21h 24 25 printStr:mov cx, len 26 s:mov ax, 0b800h 27 mov dx, cx 28 mov ch, 0 29 mov cl, bh 30 t:add ax, 10 31 loop t 32 mov cx, dx 33 mov es, ax 34 mov di, si 35 add di, si 36 mov al, [si] 37 mov es:[di], al 38 mov es:[di].1, bl 39 inc si 40 loop s 41 ret 42 code ends 43 end start
- 运行测试

5. 实验任务5
- task5源码
1 assume cs:code, ds:data 2 data segment 3 stu_no db '201983300512' 4 len = $ - stu_no 5 data ends 6 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 call blueCurtain 12 call printStu_no 13 14 mov ah, 4ch 15 int 21h 16 printStu_no:mov ax, 0b800h 17 mov cx, 24 18 s:add ax, 10 19 loop s 20 mov es, ax 21 mov di, 0 22 mov cx, 34 23 l:mov byte ptr es:[di], '-' 24 add di, 2 25 loop l 26 mov cx, len 27 mov si, offset stu_no 28 t:mov dl, [si] 29 mov es:[di], dl 30 inc si 31 add di, 2 32 loop t 33 mov cx, 34 34 r:mov byte ptr es:[di], '-' 35 add di, 2 36 loop r 37 ret 38 39 blueCurtain:mov ax, 0b800h 40 mov es, ax 41 mov cx, 2000 42 mov si, 0 43 b:mov byte ptr es:[si].1, 23 44 add si, 2 45 loop b 46 ret 47 48 code ends 49 end start
- 运行测试


浙公网安备 33010602011771号