问题 9.1
如何在汇编源程序中使用指令将本源程序某条(些)指令复制到本程序的另一处?方法如下:
1. 取得需要复制的指令所在的内存单元地址,将该地址内存单元所存储的指令信息传送到寄存器中。
mov reg,sreg:[...]
2. 取得目标内存单元的地址,将寄存器存储的内容传送到目标内存单元。
mov sreg:[...],reg
如果指令信息占用的存储空间较大,以致于用一个寄存器不足以全部传送所有指令信息,则可以循环执行上述两个指令,直到将全部指令信息传送完毕为止。
由于不允许在两个内存单元之间传送信息,所以不能将指令信息从某处内存空间直接传送到另一处内存空间的存储...
[2023-06-05 15:58] 第9章 问题 9.1
阅读全文 |
评论次数(0) |
浏览次数(105) |
所属类型(问题分析)
[2023-04-30 16:40] 第5章 问题 5.4
问题 5.4
应用 loop 指令,改进程序 5.5,使程序的代码行数能让人接受。可以有如下 2 种方法:
方法 1:
assume cs:code
code segment
mov ax,0ffffh
mov ds,ax ; 设置 (ds)=ffffh
mov dx,0 ; 初始化累加寄存器,(dx)=0
mov cx,0bh ; 初始化累加计数寄存器,(cx)=0bh
s:
mov bx,cx
mov al,[bx]
mov ah,0 ; (ax)=((ds)*16+Xh)...
应用 loop 指令,改进程序 5.5,使程序的代码行数能让人接受。可以有如下 2 种方法:
方法 1:
assume cs:code
code segment
mov ax,0ffffh
mov ds,ax ; 设置 (ds)=ffffh
mov dx,0 ; 初始化累加寄存器,(dx)=0
mov cx,0bh ; 初始化累加计数寄存器,(cx)=0bh
s:
mov bx,cx
mov al,[bx]
mov ah,0 ; (ax)=((ds)*16+Xh)...
阅读全文 |
评论次数(0) |
浏览次数(104) |
所属类型(问题分析)
[2023-04-28 17:12] 第5章 问题 5.3
问题 5.3
改进“问题 5.2”中的程序代码,提高 123*236 的计算速度。书本思路:将 123*236 的乘数和被乘数颠倒。
基于书本的思路,可以有更快的计算速度:除颠倒乘数和被乘数位置而变成 236*123 外,可以使用将式子变换为 236*2ⁿ,再将乘数 123 与 2ⁿ 进行迭代比较,使两者不断接近直至达到两者之差最小(0、1 或 -1),然后对计算结果进行适当修正(如果需要的话)以使两者完全相等。
236*2ⁿ 可以通过 loop 循环的方法来实现:
mov ax,236
s: add ax,ax
...
loop s
程序代码如下(以 236*3、...
改进“问题 5.2”中的程序代码,提高 123*236 的计算速度。书本思路:将 123*236 的乘数和被乘数颠倒。
基于书本的思路,可以有更快的计算速度:除颠倒乘数和被乘数位置而变成 236*123 外,可以使用将式子变换为 236*2ⁿ,再将乘数 123 与 2ⁿ 进行迭代比较,使两者不断接近直至达到两者之差最小(0、1 或 -1),然后对计算结果进行适当修正(如果需要的话)以使两者完全相等。
236*2ⁿ 可以通过 loop 循环的方法来实现:
mov ax,236
s: add ax,ax
...
loop s
程序代码如下(以 236*3、...
阅读全文 |
评论次数(0) |
浏览次数(108) |
所属类型(问题分析)
[2023-04-28 16:57] 第5章 问题 5.1
问题 5.1
指令和内存地址 21000H~21007H 存储单元所存储的数据情况如下:
mov ax,2000H 数据 地址
mov ds,ax BE 21000H
mov bx,1000H 00 21001H
mov ax,[bx] 21002H
inc bx 21003H
inc bx 21004H
mov [bx],ax 21005H
inc bx ...
指令和内存地址 21000H~21007H 存储单元所存储的数据情况如下:
mov ax,2000H 数据 地址
mov ds,ax BE 21000H
mov bx,1000H 00 21001H
mov ax,[bx] 21002H
inc bx 21003H
inc bx 21004H
mov [bx],ax 21005H
inc bx ...
阅读全文 |
评论次数(0) |
浏览次数(98) |
所属类型(问题分析)
[2023-04-18 17:48] 第3章 问题 3.11、3.12
问题 3.11、3.12
将10000H~1FFFFH地址空间当作栈段,初始状态为空,则SS=1000H时,SP寄存器存储的数据是什么?栈空间的容量有多大?
当初始状态栈设置SS=1000H,则只要既不用手工也不通过指令对SS进行修改,只是任SP随栈指令操作而自然变动,SS是不会因SP的任何改变而发生改变。SP的变化范围是0000H~FFFFH,所以当SP=0000H时,再次执行push将使得SP=SP-2,由于溢出效应,SP变为FFFEH,于是SS:SP由1000:0000变为1000:FFFE;当SP=FFFFH,再次执行pop使得SP=SP+2,溢出效应导致SP由FFFFH变为0...
将10000H~1FFFFH地址空间当作栈段,初始状态为空,则SS=1000H时,SP寄存器存储的数据是什么?栈空间的容量有多大?
当初始状态栈设置SS=1000H,则只要既不用手工也不通过指令对SS进行修改,只是任SP随栈指令操作而自然变动,SS是不会因SP的任何改变而发生改变。SP的变化范围是0000H~FFFFH,所以当SP=0000H时,再次执行push将使得SP=SP-2,由于溢出效应,SP变为FFFEH,于是SS:SP由1000:0000变为1000:FFFE;当SP=FFFFH,再次执行pop使得SP=SP+2,溢出效应导致SP由FFFFH变为0...
阅读全文 |
评论次数(0) |
浏览次数(105) |
所属类型(问题分析)
[2023-04-18 16:17] 第3章 问题 3.10
问题 3.10
在地址10000H处写入字型数据2266H,要求不能使用“mov 内存单元, 寄存器”这类指令,所使用的指令中包含以下两条指令:
mov ax, 2266H
push ax
可以有两种方法:
(1) 将地址为10000H+2内存单元设置为栈顶,即让SS:SP指向1000:0002内存单元(书本使用的方法)
mov ax, 1000H
mov SS, ax
mov SP, 2
最后使用提供的mov和push指令完成将数据2266H写入10000H地址内存单元的操作:
mov ax, 2266H
push ax
(2) 设置DS=1000H,使用默认S...
在地址10000H处写入字型数据2266H,要求不能使用“mov 内存单元, 寄存器”这类指令,所使用的指令中包含以下两条指令:
mov ax, 2266H
push ax
可以有两种方法:
(1) 将地址为10000H+2内存单元设置为栈顶,即让SS:SP指向1000:0002内存单元(书本使用的方法)
mov ax, 1000H
mov SS, ax
mov SP, 2
最后使用提供的mov和push指令完成将数据2266H写入10000H地址内存单元的操作:
mov ax, 2266H
push ax
(2) 设置DS=1000H,使用默认S...
阅读全文 |
评论次数(0) |
浏览次数(150) |
所属类型(问题分析)
[2023-04-17 11:33] 第3章 问题 3.9
问题 3.9
(1) 将 10000H~1000FH 这段空间当作钱,初始状态栈为空
(2) 设置 AX=001AH,BX=001BH
上述两项的指令参考“问题 3.8”。
(3) 利用栈实现交换 AX 和 BX 中的数据
push ax
push bx
pop ax
pop bx
注意指令的顺序。也可以:
push bx
push ax
pop bx
pop ax...
(1) 将 10000H~1000FH 这段空间当作钱,初始状态栈为空
(2) 设置 AX=001AH,BX=001BH
上述两项的指令参考“问题 3.8”。
(3) 利用栈实现交换 AX 和 BX 中的数据
push ax
push bx
pop ax
pop bx
注意指令的顺序。也可以:
push bx
push ax
pop bx
pop ax...
阅读全文 |
评论次数(0) |
浏览次数(136) |
所属类型(问题分析)
[2023-04-17 11:23] 第3章 问题 3.8
问题 3.8
(1) 将 10000H~1000FH 这段空间当作栈,初始状态栈为空
参考“问题 3.7”:
mov cx, 1000H
mov SS, cx
mov SP, 0010H
(2) 设置 AX=001AH,BX=001BH
mov ax, 001AH
mov bx, 001BH
(3) 将 AX、BX 中的数据入栈
push ax
push bx
(4) 将 AX、BX 清零
sub ax, ax
mov bx, ax
(5) 从栈中恢复 AX、BX 原来的内容
pop bx
pop ax
注意,栈空间中出、入栈遵循的规则是“后进先出”...
(1) 将 10000H~1000FH 这段空间当作栈,初始状态栈为空
参考“问题 3.7”:
mov cx, 1000H
mov SS, cx
mov SP, 0010H
(2) 设置 AX=001AH,BX=001BH
mov ax, 001AH
mov bx, 001BH
(3) 将 AX、BX 中的数据入栈
push ax
push bx
(4) 将 AX、BX 清零
sub ax, ax
mov bx, ax
(5) 从栈中恢复 AX、BX 原来的内容
pop bx
pop ax
注意,栈空间中出、入栈遵循的规则是“后进先出”...
阅读全文 |
评论次数(0) |
浏览次数(116) |
所属类型(问题分析)
[2023-04-17 11:02] 第3章 问题 3.7
问题 3.7
将 10000H~1000FH 这段空间当作栈,初始状态为空,要把 AX、BX、DS 中的数据入栈,应该怎样编写程序指令?
由于栈空间范围是 10000H~1000FH 且初始状态为空,这时 SS:SP 指向的地址为 1000FH + 1 = 10010H(参考“问题 3.6”),设置 SS=1000H,则 SP=0010H。由于 SS 是段寄存器,因此使用下面的指令来实现该设置:
mov ax, 1000H
mov SS, ax
mov SP, 0010H
注意,不能将常量数据直接通过 mov 指令传送给段寄存器,即下面的指令是非法的:
mov SS, 100...
将 10000H~1000FH 这段空间当作栈,初始状态为空,要把 AX、BX、DS 中的数据入栈,应该怎样编写程序指令?
由于栈空间范围是 10000H~1000FH 且初始状态为空,这时 SS:SP 指向的地址为 1000FH + 1 = 10010H(参考“问题 3.6”),设置 SS=1000H,则 SP=0010H。由于 SS 是段寄存器,因此使用下面的指令来实现该设置:
mov ax, 1000H
mov SS, ax
mov SP, 0010H
注意,不能将常量数据直接通过 mov 指令传送给段寄存器,即下面的指令是非法的:
mov SS, 100...
阅读全文 |
评论次数(0) |
浏览次数(91) |
所属类型(问题分析)
[2023-04-17 10:32] 第3章 问题 3.6
问题 3.6
对于一个空栈,SS:SP 将指向一个怎样的位置?
先探讨内存中字型数据的情况。对于字型数据,仿佛存在一个字指针,字指针总是指向字型数据的低 8 位地址单元。本节前面讲过,出入栈操作都是以字为单位进行,可见栈顶元素就是一个字型数据;出入栈的操作对象是 SS:SP 指向的内存单元,可见 SS:SP 就是栈元素字型数据的字指针;因此 SS:SP 指向的正是栈顶元素字型数据的低 8 位地址单元而不是高 8 位地址单元。字型数据的低 8 位地址代表该字型数据的地址,可见表示字型数据的 [address] 与栈顶元素字型数据一一对应,而[address]与寄存器名表示的字型数据一一对...
对于一个空栈,SS:SP 将指向一个怎样的位置?
先探讨内存中字型数据的情况。对于字型数据,仿佛存在一个字指针,字指针总是指向字型数据的低 8 位地址单元。本节前面讲过,出入栈操作都是以字为单位进行,可见栈顶元素就是一个字型数据;出入栈的操作对象是 SS:SP 指向的内存单元,可见 SS:SP 就是栈元素字型数据的字指针;因此 SS:SP 指向的正是栈顶元素字型数据的低 8 位地址单元而不是高 8 位地址单元。字型数据的低 8 位地址代表该字型数据的地址,可见表示字型数据的 [address] 与栈顶元素字型数据一一对应,而[address]与寄存器名表示的字型数据一一对...
阅读全文 |
评论次数(0) |
浏览次数(100) |
所属类型(问题分析)