汇编- MOV AL,INPUT+2 ;这里为什么+2,谢谢

问题描述

MOV AL,INPUT+2 ;这里为什么+2,谢谢

;功能:输入一个0~19的整数,输出其平方值

;作者:KDF5000

;时间:2012.11.9

.386

DATA SEGMENT USE16

SQUARE DW 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361 ;存入0~19的平方值便于查询

INPUT DB 8

DB ?

DB 8 DUP('$') ;次缓冲区用于存放输入的值

OUTPUT DB '$' ;此区存放平方值的输出

ERROR DB 'your input is incorrect!$'

MESSAGE DB 'please enter a number(0~19):$'

RESULT DB 0DH,0AH,' the result is:$'

EXITMES DB 0DH,0AH,'thank you for your use!',0DH,0AH,'$'

HUANHANG DB 0DH,0AH,'$'

DATA ENDS

STACK SEGMENT USE16 STACK

DB 200 DUP(0)

STACK ENDS

CODE SEGMENT USE16

ASSUME DS:DATA,CS:CODE,SS:STACK

BEGIN:

MOV AX,DATA

MOV DS,AX

 ;输出提示信息
  LEA   DX,MESSAGE
  MOV   AH,9
  INT   21H  

  ; 输入数值
  LEA  DX,INPUT
  MOV  AH,10
  INT  21H  

  ;如果输入空格则推出程序
  MOV   AL,INPUT+2  ;***********************这里为什么+2
  CMP   AL,20H
  JE    EXIT  

  ;取出输入的数值
  LEA   SI,INPUT+2
  MOV   AX,0
  MOV   BL,10
  MOV   CL,INPUT+1    ;记录循环的次数  

  ;将输入的值放到AX

LOPA: MOV DL,[SI]

DEC CL

SUB DL,30H

MUL BL

ADD AX,DX

INC SI

CMP CL,0

JE NEXT

JMP LOPA

NEXT:

;如果输入的数字大于十九或者小于小于0报错

CMP AX,19

JG ERROR1

CMP AX,0

JB ERROR1

  MOV   BP,AX              ;将输入的数据作为变量
  MOV   AX,SQUARE[EBP*2]   ;此时AX存放平方值  

  MOV   CL,10   ;设置除数
  MOV   SI,OFFSET OUTPUT

LOPB: ;次循环为把已经存入的平方值转换为十进值输出

DEC SI

DIV CL

ADD AH,30H

MOV [SI],AH

MOV AH,0

CMP AL,0

JNE LOPB

;输出结果提示

LEA DX,RESULT

MOV AH,9

INT 21H

;输出十进制平方值

MOV DX,SI

MOV AH,9

INT 21H

;输出换行

LEA DX,HUANHANG

MOV AH,9

INT 21H

;跳到开始继续输入

JMP BEGIN

ERROR1:

LEA DX,HUANHANG

MOV AH,9

INT 21H

  LEA  DX,ERROR
  MOV   AH,9
  INT   21H  

  LEA  DX,HUANHANG
  MOV   AH,9
  INT   21H  

  JMP   BEGIN

EXIT:

LEA DX,EXITMES ;输出退出信息

MOV AH,9

INT 21H

  MOV   AH,4CH
  INT   21H

CODE ENDS

END BEGIN

解决方案

;如果输入空格则推出程序

MOV AL,INPUT+2 ;***********************这里为什么+2
CMP AL,20H

JE EXIT

这里为什么+2啊。。。谢谢啦~~~

解决方案二:

用int 21h接收字符串的缓冲区的格式是第一个字节是缓冲区大小,第二个字节是实际接收的大小,第三个字节起才是实际内容。所以INPUT+2才是实际接收内容的第一个字符。

时间: 2024-10-21 11:18:13

汇编- MOV AL,INPUT+2 ;这里为什么+2,谢谢的相关文章

汇编语言-汇编MOV的一点疑问!!!

问题描述 汇编MOV的一点疑问!!! DATA SEGMENT USE16 MES1 DB 'Please input:',0AH,0DH,'$' SD DB ? DATA ENDS 然后 MOV AH,1 INT 21H MOV SD,AL 然后就对SD进行操作了 想问下MOV的目的操作数可以是变量(SD)吗??不是只能是寄存器和存储器吗? 解决方案 MOV AH,1 INT 21H 是自动转入中断子程序的入口 通过上面两条指令,会把输入或者读取的字符放到AL中,所以是MOV SD,AL 解决

汇编-mov di,16h 和mov di,16有什么不同吗?代码中有注释哪里有问题

问题描述 mov di,16h 和mov di,16有什么不同吗?代码中有注释哪里有问题 DATA SEGMENT STRG DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46H DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA S

汇编-显示我放到AL中的数值

按书上练习,有一些我看不懂. .386 .model flat,stdcall option casemap:none include \masmplus\include\windows.inc include \masmplus\include\kernel32.inc includelib \masmplus\lib\kernel32.lib include \masmplus\include\user32.inc includelib \masmplus\lib\user32.lib .d

汇编源代码之汇编语言制作的光带菜单及源程序(1.0)

这个是我上大二的时候的汇编语言课程设计.自己做得很满意.现在拿出来,给大家看看.我对部分代码又从新做了调整.编译后大小比原来大了一点,不过速度上去了.其实就是一个图形接口.你只要在中间加上自己的实用功能,就可以直接用了.代码我都有注释,读起来应该不会有什么问题.当然,汇编的代码本身就很难读.所以有什么不是很好懂的地方,可以直接同我联系. 我还给同学做过一个C语言版的光带菜单,不过很可惜的是自己做得不是很满意,就把程序给删掉了.大家也就看不到了 本程序用 tasm 进行编译,tlink 进行连接.

汇编源码系列之burnout

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... COMMENT * Demo (and semi-useful) program to read/set burnout device parameters. Usage: burnout [ticks] [C+-] [V+-] [H+-] Parameters can be separated by almost anything. W

GCC的内嵌汇编语法

1 Overview 开发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由于启动部分的代码有大小限制,使用精练的汇编可以缩小目标代码的Size.另外,对于某些需要被经常调用的代码,使用汇编来写可以提高性能.所以我们必须了解汇编语言,即使你有可能并不喜欢它.     如果我们选择的OS开发工具是GCC以及GAS的话,就必须了解AT&T汇编语言语法,因为GCC/GAS只支持这种汇编语法.  本文只讨论AT&T的汇编语法,以及G

汇编语言-救急!求大神这段C语言改写成汇编

问题描述 救急!求大神这段C语言改写成汇编 5C #include #include #include #include #define PageUp 0x4900#define PageDown 0x5100#define Home 0x4700#define End 0x4F00#define Esc 0x011B void char2hex(char xx char s[]) /* 把8位数转化成16进制格式 /{ char t[] = ""0123456789ABCDEF&qu

汇编 汇编语言-汇编多重循环 九九乘法表

问题描述 汇编多重循环 九九乘法表 要求用多重循环结构打印梯形结构的九九乘法表,我的思路是外层循环做第一个乘数的INC,里层循环做打印.乘法运算.两个乘数作比较判断是否换行以及第二个乘数的INC.既不知道我的思路能不能实现也不知道我的代码哪里出了问题,求大神指点. 解决方案 九九乘法表 解决方案二: 80x86汇编语言编程:在九九乘法表中高亮显示结果 用汇编语言编程解答: 编程输出九九乘法表,然后通过键盘输入两个数后,对应位置的乘法运算高亮. 例如:输入4.5,那么,4 * 5 = 20 的位置

C语言ASM汇编内嵌语法【转】

转自:http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM--GCC内联汇编.这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码中,另外也允许我们直接写 C/C++代码中使用汇编编写简洁高效的代码. 1.基本内联汇编 GCC中基本的内联汇编非常易懂,我们先来看两个简单的例子: __asm__