说明下面各条指令的具体错误原因 ⑴ mov cx,dl⑵ mov ip,ax ⑶ mov es,1234h⑷ mov es,ds ⑸ mov al,300⑹ mov [sp],ax ⑺ mov ax,bx+di⑻ mov 20h,ah 10.假设DS=2000H、BX=1256H、TABLE的偏移地址是20A1H,物理地址232F7H处存放3280H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么? ⑴ JMP BX ⑵ JMP TABLE[BX]
时间: 2024-02-16 17:02:06 浏览: 317
⑴ mov cx,dl:这条指令的错误原因是,DL寄存器只有8位,而CX寄存器有16位,无法直接将DL的值赋值给CX。
⑵ mov ip,ax:这条指令的错误原因是,IP寄存器是指令指针寄存器,它不能被直接赋值。
⑶ mov es,1234h:这条指令的错误原因是,ES寄存器是段寄存器,它的值必须是指向有效内存段的段地址。
⑷ mov es,ds:这条指令的错误原因是,ES寄存器是段寄存器,它的值必须是指向有效内存段的段地址。
⑸ mov al,300:这条指令的错误原因是,AL寄存器只有8位,无法容纳300的值。
⑹ mov [sp],ax:这条指令的错误原因是,SP寄存器是栈指针寄存器,它不能被直接赋值。
⑺ mov ax,bx+di:这条指令的错误原因是,BX和DI寄存器都是16位的,但是它们的值相加可能会产生进位,导致结果不正确。
⑻ mov 20h,ah:这条指令的错误原因是,20h是一个内存地址,不能作为目的操作数,AH寄存器也不能作为源操作数。
10. 对于DS=2000H、BX=1256H、TABLE的偏移地址是20A1H,物理地址232F7H处存放3280H,执行下列段内间接寻址的转移指令后,转移的有效地址是:
⑴ JMP BX:转移的有效地址为DS:BX,即2000:1256H。
⑵ JMP TABLE[BX]:先计算TABLE[BX]的值,TABLE的偏移地址是20A1H,加上BX的值1256H,得到物理地址232F7H,该地址处的值是3280H,转移的有效地址为232F7H。
相关问题
具体详细解释一下assume cs:code, ds:data, ss:stack data segment db 'welcome to masm!' db 2,36,113 data ends stack segment db 16 dup(0) stack ends code segment start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, 0 call show_str mov ax, 4c00h int 21h show_str: push ax push ds mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, 200h mov bx, 0 mov di, 16 mov ax, 0b800h mov es, ax mov si, 16012+322 mov cx, 3 s1: mov dh, [di] push cx mov cx, 16 s0: mov dl, [bx] mov es:[si], dx add si, 2 inc bx loop s0 pop cx inc di add si, 80h sub bx, bx loop s1 add sp, 200h pop ds pop ax ret code ends end start的意思
这代码是一个简单的汇编程序,它的作用是在屏幕上显示一段字符串 "welcome to masm!"。下面是对代码中各个部分的解释:
1. `assume cs:code, ds:data, ss:stack`:这条语句告诉汇编器程序中使用的段寄存器和其对应的段名。
2. `data segment`:定义数据段,用于存储程序中使用到的数据。
3. `db 'welcome to masm!' db 2,36,113`:在数据段中定义了一个字符串 'welcome to masm!',并在其后面添加了两个字节的数据 2、36、113。
4. `data ends`:数据段结束标识符。
5. `stack segment`:定义栈段,用于存储程序中使用到的栈。
6. `db 16 dup(0)`:在栈段中定义了一个大小为 16 的栈,初始值为 0。
7. `stack ends`:栈段结束标识符。
8. `code segment`:定义代码段,用于存储程序的代码。
9. `start:`:程序的起始标签。
10. `mov ax, data`:将数据段的段地址存储到寄存器 ax 中。
11. `mov ds, ax`:将数据段的段地址存储到段寄存器 ds 中。
12. `mov ax, stack`:将栈段的段地址存储到寄存器 ax 中。
13. `mov ss, ax`:将栈段的段地址存储到段寄存器 ss 中。
14. `mov sp, 0`:将栈顶指针 sp 的初始值设为 0。
15. `call show_str`:调用 show_str 过程,显示字符串。
16. `mov ax, 4c00h`:将 4c00h 存储到寄存器 ax 中,该值表示程序正常退出。
17. `int 21h`:调用 21h 中断,程序正常退出。
18. `show_str:`:显示字符串的过程。
19. `push ax`:将寄存器 ax 压入栈中。
20. `push ds`:将段寄存器 ds 压入栈中。
21. `mov ax, data`:将数据段的段地址存储到寄存器 ax 中。
22. `mov ds, ax`:将数据段的段地址存储到段寄存器 ds 中。
23. `mov ax, stack`:将栈段的段地址存储到寄存器 ax 中。
24. `mov ss, ax`:将栈段的段地址存储到段寄存器 ss 中。
25. `mov sp, 200h`:将栈顶指针 sp 的初始值设为 200h。
26. `mov bx, 0`:将寄存器 bx 的初始值设为 0。
27. `mov di, 16`:将寄存器 di 的初始值设为 16。
28. `mov ax, 0b800h`:将 0b800h 存储到寄存器 ax 中,该值表示显示缓冲区的地址。
29. `mov es, ax`:将寄存器 ax 的值存储到段寄存器 es 中,设置显示缓冲区的段地址。
30. `mov si, 16012+322`:将寄存器 si 的初始值设为 16012+322,该值表示显示缓冲区中的一行字符的起始地址。
31. `mov cx, 3`:将寄存器 cx 的初始值设为 3,表示要显示 3 行字符串。
32. `s1:`:循环开始标签。
33. `mov dh, [di]`:将数据段中 di 指向的字节读取到寄存器 dh 中,该字节存储了字符的高位属性。
34. `push cx`:将寄存器 cx 压入栈中。
35. `mov cx, 16`:将寄存器 cx 的值设为 16,表示要读取 16 个字符。
36. `s0:`:循环开始标签。
37. `mov dl, [bx]`:将数据段中 bx 指向的字节读取到寄存器 dl 中,该字节存储了字符的 ASCII 码。
38. `mov es:[si], dx`:将寄存器 dx 中的值存储到显示缓冲区中,表示要显示一个字符。
39. `add si, 2`:将显示缓冲区指针 si 加上 2,指向下一个字符的位置。
40. `inc bx`:将数据段指针 bx 加上 1,指向下一个字符。
41. `loop s0`:循环执行 s0 中的操作,直到寄存器 cx 的值减为 0。
42. `pop cx`:弹出栈中的寄存器 cx。
43. `inc di`:将数据段指针 di 加上 1,移动到下一行的起始位置。
44. `add si, 80h`:将显示缓冲区指针 si 加上 80h,移动到下一行的起始位置。
45. `sub bx, bx`:将数据段指针 bx 设为 0,从头开始读取字符串。
46. `loop s1`:循环执行 s1 中的操作,总共执行 3 次。
47. `add sp, 200h`:将栈顶指针 sp 加上 200h,恢复栈顶指针。
48. `pop ds`:弹出栈中的段寄存器 ds。
49. `pop ax`:弹出栈中的寄存器 ax。
50. `ret`:返回到主程序的调用处。
51. `code ends`:代码段结束标识符。
52. `end start`:程序结束标识符。
说一下下面的设计思路assume cs:code, ds:data, ss:stack data segment db 'welcome to masm!' db 2,36,113 data ends stack segment db 16 dup(0) stack ends code segment start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, 0 call show_str mov ax, 4c00h int 21h show_str: push ax push ds mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, 200h mov bx, 0 mov di, 16 mov ax, 0b800h mov es, ax mov si, 160*12+32*2 mov cx, 3 s1: mov dh, [di] push cx mov cx, 16 s0: mov dl, [bx] mov es:[si], dx add si, 2 inc bx loop s0 pop cx inc di add si, 80h sub bx, bx loop s1 add sp, 200h pop ds pop ax ret code ends end start
这是一个使用汇编语言编写的程序,分为数据段、栈段和代码段。数据段中定义了一个字符串“welcome to masm!”以及两个字节2和36和一个字节113。栈段定义了一个16字节的空间用于存放栈。代码段中包含了一个入口点start,程序开始执行时将数据段的地址赋给ds寄存器,将栈段的地址赋给ss寄存器,并将栈指针sp设为0。然后调用了一个子程序show_str,在这个子程序中,先将ax和ds寄存器的值入栈,然后将数据段的地址赋给ds寄存器,将栈段的地址赋给ss寄存器,并将栈指针sp设为200h。接下来使用循环将字符串“welcome to masm!”输出到屏幕上,输出的位置是屏幕的第13行第33列开始,输出的颜色是白色。最后将栈指针sp增加200h,将ds和ax寄存器的值弹出栈,程序结束。
阅读全文