注释一段简单汇编代码,实现将输入字符串反转输出的

用循环来压入堆栈。。用循环出栈。。。实现字符串反转。。。循环次数10次。。 麻烦帮忙注释一下每句的作用。。刚刚接触。。

还有就是寄存器的变化是怎么样的。。我用debug的t命令跟踪了。。看不太懂
STACK SEGMENT PARA STACK 'STACK'
DW 10 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STACK
START:MOV CX,10
MOV SP,20
LP1:MOV AH,01H
INT 21H
MOV AH,0
PUSH AX
LOOP LP1
MOV CX,10
LP2:POP DX
MOV AH,02H
INT 21H
LOOP LP2
MOV AH,4CH
INT 21H
CODE ENDS
END START

应该是这样了。至于寄存器的变化。还得靠你自己好好观察。另外推荐你去下载emu8086这个软件。
STACK SEGMENT PARA STACK 'STACK'
DW 10 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STACK
START:MOV CX,10 ; 循环次数
MOV SP,20 ; 栈指针。指向栈底,每压一次栈 就减2

LP1:MOV AH,01H ;
INT 21H ; 接收字符

MOV AH,0 ;上句接收完字符会放在al,然后把ah清0,(因为下句的压栈,是字操作, 所以要压入al,就要连同ah一起压,为了不影响输入,就把ah清0)
PUSH AX ; 现在ax放的就是你输入的字符的ascii码,把它压入栈
LOOP LP1 ;然后循环。循环10次后,你最后输入的字符的ascii码会在最上面

MOV CX,10 ;以下的输出
LP2: POP DX ;把栈顶的值推到dx.配合下两句的显示
MOV AH,02H ;
INT 21H ;显示dl的值对应的字符
LOOP LP2 ;循环10次。实现反序

MOV AH,4CH ;
INT 21H ;
CODE ENDS
END START
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-12
STACK SEGMENT PARA STACK 'STACK'
DW 10 DUP(?) ;20个字节的栈
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE, SS:STACK
START:
MOV CX,10 ;cx保存循环次数
MOV SP,20 ;sp指向栈顶
LP1:
MOV AH,01H ;1号功能从键盘读1个字符到al
INT 21H
MOV AH,0 ;清空ah
PUSH AX ;入栈
LOOP LP1 ;循环读取下一个字符,直到cx=0

MOV CX,10 ;cx=10,再次循环10次
LP2:
POP DX ;取栈顶元素
MOV AH,02H ;2号功能输出al的字符
INT 21H
LOOP LP2 ;循环输出下一个字符,直到cx=0

MOV AH,4CH ;程序结束
INT 21H
CODE ENDS
END START

栈指针sp是从高地址向低地址增长的,所以你push一个ax,sp会-2,pop一个sp则会+2
栈就是后进先出的操作,所以最后push进来的字符被最先pop出来,因此实现了你程序中的字符串逆序

汇编指令 NEG 有什么功能?
汇编指令NEG,堪称计算机编程中的小巧魔术,它的功能在x86架构下显得尤为独特。 这个指令,实际上是无符号数的求补操作,其核心原理是将输入的二进制位进行逐位取反,然后在所有位上加一。这一步骤看似简单,但却在数据处理和运算中扮演着不可或缺的角色(不同于常规教材中涉及的有符号数求补,它无需...

求用汇编语言编写一段程序实现让步进电机正转90度后,暂停5秒后再反转90...
OUT DX,AL ;8255C输入,A输出 MOV BUF,33H OUT1:MOV AL,BUF MOV DX,P55A OUT DX,AL MOV AH,1 INT 16H JE IN1 ;有无键按下 MOV AH,4CH INT 21H IN1:MOV DX,P55C IN AL,DX ;读开关状态 TEST AL,01H JNZ K0 TEST AL,02H JNZ K1 TEST AL,04H JNZ K2 TEST AL,08H ...

RGSS 中执行机器码
CallWindowProc API接受五个参数,其中p表示机器码(字符串)的地址,四个L为可选参数,返回值由%eax输出。接下来,设想一个汇编子程序,用于接收两个整数参数,将它们的和保存在%eax中。我们尝试去掉堆栈框架(push ebp ~ leave)以节省空间。这段子程序的机器码可以被翻译成特定指令序列。我们修正了原...

pic单片机怎么用户汇编语言实现位取反?
2、在汇编语言中要实现位取反,可通过位状态检测判断来对位进行“置1”或“清零”,详见以下程序。目的:将寄存器 PROTB,3 取反 ;BTFSS PORTB,3 ; 检测PORTB,3位,为1跳转QINGLING。GOTO ZHIYI ; 为0跳转到ZHIYI。QINGLING ; 清零程序段,这是网络标号,可理解为一段程...

如何在C\/C++使用内联汇编
以下所说嵌入的汇编都是GUN 的C语言中嵌入ARM汇编。 1)2个参数的内嵌语句 这种形式的汇编用于简单的语句,参数限制输入和输出语法格式如下: asm(code : output operand list : inputoperand list : clobber list); 汇编和C语句这间的联系是通过上面asm声明中可选的output operand list和input ...

请问谁有LCD1602、24C04,设计的电子密码锁源程序?上网搜了好多都不...
论文阐述一个基于单片机的液晶显示电子密码 锁的设计与实现。系统采用美国 Atmel 公司的 AT89S52 单片机作为 系统核心,液晶显示器 LCD1602 作为输出设备显示系统提示信息, 4*4 矩阵薄膜键盘作为输入设备,配合蜂鸣器、继电器等电路构成整 个系统硬件;系统软件采用汇编语言编写。设计的系统液晶显示,密 码修改方便,具有报警...

如何在C语言中嵌入汇编?
在每条汇编指令之前加 __asm 关键字: __asm MOV AL, 2 __asm MOV DX, 0xD007 __asm OUT AL, DX因为__asm 关键字是语句分隔符,所以可以把多条汇编指令放在同一行: __asm MOV AL, 2 __asm MOV DX, 0xD007 __asm OUT AL, DX 显然,第一种方法与 C\/C++ 的风格很一致,并且把汇编代码和 C\/...

通用步进电机控制器设计(精通单片机汇编语言的朋友进)
译码单元: 译码器输入A、B、C与系统地址线A2、A3、A4相连;译码器控制端G与系统地址线A0下方的G相连。8259单元: CS端与译码器单元的Y0相连;D0~7与系统数据总线单元任一插座相连;最后,将8253的OUT0与8259的IR7相连。<实验程序> CODE SEGMENT ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3400H...

编写一个AT89C52单片机控制四相单四拍步进电机汇编程序,急用...
while(string[i]!='\\0') \/\/只要没有显示到字符串的结束标志'\\0',就继续 { WriteData(string[i]); \/\/将第i个字符数组元素写入LCD i++; \/\/指向下一个数组元素 } WriteAddress(0x46); \/\/写地址,将第二个分号显示在第2行第7列 WriteData(':'); \/\/将分号的字符常量写入LCD WriteAddress(0x49);...

CC程序员实用大全怎么样
‘\\N’ 295 直接输出 296 将按键放回键盘缓存 297 使用CPPINTF快速格式化输出 298 快速格式化键盘输入 299 写字符串 300 使用直接I\/O实现更快的字符串输出 301 从键盘读入字符串 302 以更快的速度从键盘输入字符串 303 以彩色显示输出 304 清除屏幕显示 305 删除当前行到行尾的内容 306 删除屏幕上的当前行 ...

相似回答