第三章 --- 第六节

编程1:

将10000H~1000FH这段空间当做栈,初始状态时空的,将AX、BX、DS中的数据入栈。

MOV  AX, 1000H

MOV  SS, AX

MOV  SP, 0010H

PUSH  AX

PUSH  BX

PUSH  DS

编程2:

(1)将10000H~1000FH这段空间当做栈,初始状态是空的;

(2)设置AX = 001AH,设置BX = 001BH;

(3)将AX、BX中的数据入栈;

(4)然后将AX、BX清零;

(5)从栈中恢复AX、BX原来的内容。

MOV  AX, 1000H

MOV  SS, AX

MOV  SP, 0010H

MOV  AX, 001AH

MOV  BX, 001BH

SUB   AX, AX

SUB   BX, BX

POP   BX

POP   AX

编程3:

(1)将10000H~1000FH这段空间当做栈,初始状态是空的;

(2)设置AX = 002AH,BX = 002BH;

(3)利用栈,交换AX和BX中的数据。

MOV  AX, 1000H

MOV  SS, AX

MOV  SP, 0010H

MOV  AX, 002AH

MOV  BX, 002BH

PUSH  AX

PUSH  BX

POP  AX

POP  BX

编程4:

我们如果要在10000H处写入字型数据2266H,可以用以下的代码完成:

MOV  AX, 1000H

MOV  DS, AX

MOV  AX, 2266H

MOV  [0],  AX

看题目:

补在10000H处写入字型数据2266H

___________________________

___________________________

___________________________

MOV  AX, 2266H

PUSH  AX

要求:不能使用“MOV 内存单元, 寄存器”这类指令。

答案:

MOV  AX, 1000H

MOV  SS, AX

MOV  SP, 0002H   ;字型单元的地址是低地址

MOV  AX, 2266H

PUSH  AX

结论:PUSH、POP实际上是一种内存传送指令,可以在寄存器和内存之间传送数据,与MOV指令不同的是,PUSH和POP指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。

同时,PUSH和POP指令还要改变SP中的内容。

 

注意:

PUSH、POP等栈操作指令,修改的只是SP,也就是说,栈顶的变化范围最大为0~FFFFH。

 

栈的综述:

1、8086CPU提供了栈的操作机制,方案如下:

在SS,SP中存放栈顶的段地址和偏移地址;

提供入栈和出栈指令,他们根据SS:SP指示的地址,按照栈的方式访问内存单元。

2、PUSH指令的执行步骤

SP = SP - 2

向SS:SP指向的字单元中送入数据

3、POP指令的执行步骤:

从SS:SP指向的字单元中读取数据

SP = SP + 2

4、任意时刻,SS:SP指向栈顶元素。

5、8086CPU只记录栈顶,栈空间的大小我们要自己管理。

6、用栈来暂存以后需要恢复的寄存器的内容时,寄存器出栈的顺序要和入栈的顺序相反。

7、PUSH、POP实质上是一种内存传送指令,注意它们的灵活使用。

 

### 回答1: 8086汇编语言,可以使用INT 21H的AH=02H断服务来输出字符。要将数字转换为字符,可以使用ADD指令将数字和0AH相加,得到十六进制的ASCII码。 以下是一个简单的示例程序,可以将包含10个数字的数组输出为字符: ``` .MODEL SMALL .STACK 100H .DATA NUMS DB 45H,12H,23H,55H,77H,33H,11H,8AH,3FH,1EH ; 数字数组 .CODE MAIN PROC MOV AX, @DATA ; 初始化数据段寄存器 MOV DS, AX MOV CX, 10 ; 数组数字的数量 MOV SI, 0 ; 数组索引 LOOP_START: MOV DL, NUMS[SI] ; 将数字加载到DL寄存器 ADD DL, 30H ; 将DL加上30H,使其变为对应的ASCII码 MOV AH, 02H ; INT 21H功能号,输出字符 INT 21H INC SI ; 数组索引加1 LOOP LOOP_START ; 循环输出所有数字 MOV AH, 4CH ; INT 21H功能号,程序结束 INT 21H MAIN ENDP END MAIN ``` 在这个程序,首先将数组NUMS的地址加载到DS寄存器,然后使用循环将数组的数字依次输出为字符。每次循环都将数字加载到DL寄存器,然后使用ADD指令将其转换为对应的ASCII码,并使用INT 21H的AH=02H断服务输出字符。 注意,这里将数字转换为字符使用的是加上30H的方法,只适用于数字0~9。如果要将其他数字转换为字符,需要使用其他方法。 ### 回答2: 要将45H,12H,23H,55H,77H,33H,11H,8AH,3FH,1EH输出成数字,可以使用8086汇编语言的“ASCII码转换为数字”的方法。 首先,将ASCII码值加载到寄存器AL,然后通过一系列的运算和处理,将其转换成对应的数字。 以下是具体的步骤: 1. 用LEA指令将存放结果的内存单元的地址加载到BX,例如:LEA BX, 结果 2. 通过MOV指令将ASC码值加载到AL,例如:MOV AL, 45H 3. 使用SUB指令将AL的值减去30H,例如:SUB AL, 30H 4. 使用MUL指令将AL乘以10,例如:MUL 10 5. 使用ADD指令将BH的值加到AL,例如:ADD AL, BH 6. 使用MOV指令将AL的值存结果的内存单元,例如:MOV [BX], AL 7. 重复上述步骤,依次将每个ASCII码值转换成数字,并存结果的内存单元。 完成上述步骤后,结果存放在结果的内存单元。 例如,假设结果存放在在地址为1000H的内存单元,则转换后的数字结果如下: 1000H: 4 (45H) 1001H: 1 (12H) 1002H: 2 (23H) 1003H: 5 (55H) 1004H: 7 (77H) 1005H: 3 (33H) 1006H: 1 (11H) 1007H: 8 (8AH) 1008H: 5 (3FH) 1009H: 2 (1EH) 注意,以上只是展示了转换的方法,具体的程序可能因为使用不同的汇编语言编译器而有所差异,需要根据实际的开发环境和需求进行适当的调整。 ### 回答3: 要将16进制数45H,12H,23H,55H,77H,33H,11H,8AH,3FH,1EH输出成数字,可以使用8086汇编语言的数值转换方法。 首先,我们需要将10进制数的每一位转换成ASCII码,然后通过调用BIOS的字符输出函数实现数字的显示。 以转换45H为例,我们可以按照以下步骤进行操作: 1. 将45H存储在16位寄存器AX。 2. 将AX的低8位部分存储在AL。 3. 将AL的个位数字转换为ASCII码,即加上30H。 4. 将结果存储在BL。 5. 再次将AL右移一位,得到十位数字。 6. 将十位数字转换为ASCII码,即加上30H。 7. 将结果存储在BH。 8. 调用BIOS的字符输出函数,将BL和BH作为参数传,实现数字的显示。 以此类推,通过重复以上步骤,将所有的16进制数转换为ASCII码,然后进行字符输出即可。 需要注意的是,在转换过程,还需判断十位数字是否为0。如果是0,则不输出。 以上是将16进制数转换为数字的基本思路,可以依此方法将给定的数值进行转换,并输出成相应的数字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值