汇编程序一些基础问题

JIAN_BOY_RISE 2016-05-30 11:22:23
今天才到自己的电脑上安装了masm6.15,可是安装之后显示edit不兼容,我是win8,于是下载了DOSBOX,用它来编写汇编,但是自己又发现问题了,之前一直用高级语言编写,以为汇编也会像高级语言一样直接编译运行,自己输入数据,然后输出结果,原来这个时候才发现根本不是那么回事啊,然后问题就来了
1.想请教一下

DATA SEGMENT
TABLE DB 0,1,4,9,16,25,36,49,64,81
BUF DB 'please input a number(0~9):',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET BUF
MOV AH,9H
INT 21H
MOV AH,01
INT 21H
AND AL,0FH
MOV BX,OFFSET TABLE
MOV AH,0
ADD BX,AX
MOV AL,[BX]
MOV DL,AL
MOV AH,02
INT 21H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
这是源代码,功能是输入一个1~9的数,然后输出其平方值,代码本身应该没有错,但是是不是我自己的输入出现了问题,我先用U 找出每一步的地址,然后g,后面跟最后一步的地址,这样意思不就是直接调运行到了最后一行的地址么ps:这种想法没错吧?然后我输入一个数,可是为什么得不出结果,后面还显示各个各个栈和寄存器的值,我的想法是就比如输入一个数9,直接输出81,后面什么栈啊寄存器啊都不显示出来,这是什么原因,还是我的DOSBOX安装除了问题,还是我的输入方式有问题?
类似于这张图片
这个代码时这样的:
STACKS SEGMENT STACK ;堆栈段
DW 128 DUP(?) ;注意这里只有128个字节
STACKS ENDS
DATAS SEGMENT ;数据段
;请在这里定义您的数据
MSG DB 'This message'
MSGLEN EQU $-MSG
DATAS ENDS
CODES SEGMENT ;代码段
ASSUME CS:CODES,DS:DATAS
START: MOV AX,DATAS ;初始化
MOV DS,AX
;请在这里添加您的代码
MOV CX,MSGLEN
MOV SI,0
MOV AH,2
NEXT:
MOV DL,MSG[SI]
INT 21H
INC SI
LOOP NEXT
MOV AX,4C00H ;退出程序
INT 21H
CODES ENDS
END START
就是输出This message,难道就不能直接运行就输出吗,非要找到地址然后g加上最后一行代码的地址?还有第一个程序后面为什么会有寄存器堆栈的值之类的?
2.第二个问题是关于一道汇编程序的
输入两个数,输出他们的积。我的代码:
CODE SEGMENT
ASSUME CS:CODE
START:MOV AH,01H
INT 21H
AND AL,0FH
MOV BL,AL
SUB BL,30H
MOV AH,01H
INT 21H
SUB AL,30H
MUL BL
MOV BL,10
DIV BL
MOV BL,AH
CMP AL,0
JE NEXT
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
ADD BL,30H,
MOV DL,BL
MOV AH,02H
INT 21H
NEXT: ADD BL,30H
MOV DL,BL
MOV AH,02
INT 21H
EXIT: MOV AX,4C00H
INT 21H
CODE ENDS
END START
真感觉没什么问题,可是一运行我就实在不解了,我贴一下自己运行的图片:

第一,当我输入7空格8时,就可卡了,这是不是系统把字符也当成了一个字符,这我还可以理解,可是我想要的结果呢?为什么没出现,后面出现这一堆是什么意思啊,我就想输出一个简简单单的56啊,感觉要炸了,第一次编汇编就弄成这样,明天得去图书馆弄本汇编的书来冷静冷静了!!希望各位大神对我这种这点小问题还弄的抓狂的一些指点啊
...全文
298 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_23107797 2016-06-01
  • 打赏
  • 举报
回复
MOV BL,0 ADD AL,BL 这2句删除 是AAM不是DAA
JIAN_BOY_RISE 2016-05-31
  • 打赏
  • 举报
回复
DATA SEGMENT TABLE DB 0,1,4,9,16,25,36,49,64,81 BUF DB 'please input a number(0~9):',0DH,0AH,'$' DATA ENDS STACK SEGMENT 'STACK' STAPN DB 100 DUP(0) TOP EQU LENGTH STAPN STACK ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,STACK MOV SS,AX MOV SP,TOP PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,9H INT 21H MOV AH,01 INT 21H AND AL,0FH MOV BX,OFFSET TABLE MOV AH,0 ADD BX,AX MOV DL,'=' ; 等号 MOV AH,2 INT 21H ;印出 MOV AL,[BX] MOV BL,0 ADD AL,BL DAA ; 转16进制为10进制BCD码,若AL=51H,AX=会转成0801(H) OR AX,3030H ;转BCD码成ASCII,AX=0801会转成3831(H) PUSH AX ;保存 MOV DL,AH ; 送AH(38)的ASCII码入DL MOV AH,2 INT 21H ;印出8的ASCII POP DX ;取回机中的AL(31)ASCII码入DL INT 21H ;印出1的ASCII RET MAIN ENDP CODE ENDS END MAIN 这是我修改后的代码,但是还是不行
zara 2016-05-31
  • 打赏
  • 举报
回复
1. debug 是调试软件,就是要告诉你当前的状态,所以程序暂停后显示各寄存器内容。
你输入 5 要输出 25,这个 25=19h 不是在 AL=DL 里么,只是,不能直接调用 int21h 的 02h 功能进行显示,这个功能是显示在 DL 里的字符的,不是显示其中的数值,把数值进行输出,要有个转换过程,将 19h 转换为字符 '2','5' 分别通过这个字符显示功能进行输出。如果想要直接进行输出,也有现成的其它方提供的库函数可以使用,比如 IRVINE 的 Write... 系列函数;但是,这样的题目往往就是想让你熟悉这个内容的,所以一般还是建议自己写相关代码。
2. 这主要是因为你对第一个输入字符到数值转换过程是错误的,先 AND 0FH 再又 SUB 30h,多余了,只要一个即可;结果就是导致后面的 div 0ah 溢出程序跑飞了。最后的输出,两次对个位数字字符处理输出,也不对的。

你看第二个代码,里面就有对结果除以 10 然后分别对两位数字进行字符输出的过程,这个就是 1. 需要的。
baidu_23107797 2016-05-31
  • 打赏
  • 举报
回复
问题太长了,楼主要先明白ASCII和值的分别,1是一个值,但须要转成ASCII码才 可以正常显示,1的ASCII是31H,2是32....9是39H 你的代码到 MOV AL,[BX]还是正常的 AL就是表格里对应的平方值,比如81,但这只是一个值,你要换成文字的81才 可显示,即8的ASCII码和1的ASCII码 但又这遇到另一个问题 代码写的是81,但变成程式(机器码)后,它在内存是16进制方式 即51(H),须把它转成10进制,转十进制的方法不少,下面是比较简单的, 代码要改成这样: ADD BX,AX ;原代码, 以下开始修改 MOV DL,'=' ; 等号 MOV AH,2 INT 21H ;印出 MOV AL,[BX] AAM ; 转16进制为10进制BCD码,若AL=51H,AX=会转成0801(H) OR AX,3030H ;转BCD码成ASCII,AX=0801会转成3831(H) PUSH AX ;保存 MOV DL,AH ; 送AH(38)的ASCII码入DL MOV AH,2 INT 21H ;印出8的ASCII POP DX ;取回机中的AL(31)ASCII码入DL INT 21H ;印出1的ASCII MOV AX,4C00H;原代码 INT 21H

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧