用汇编语言编写:由键盘输入两个整数val1和val2,输出稍大于val1且是val2整

作者&投稿:隐贡 (若有异议请与网页底部的电邮联系)
用汇编语言编写:由键盘输入两个整数val1和val2,输出稍大于val1且是val2整~

CODE SEGMENT ASSUME CS:CODE ORG 100H START: JMP BBB VAL1 DW ? VAL2 DW ? VAL3 DW ? LFCR DB 13,10,'$' BBB: PUSH CS POP DS PUSH CS POP ES CALL INPUTNUM LEA SI,ARRAY MOV AX,[SI] MOV VAL1,AX MOV VAL3,AX MOV AX,[SI+2] MOV VAL2,AX MOV BX,VAL2 MOV AX,VAL3 @MAIN: MOV DX,0 INC AX PUSH AX DIV BX CMP DX,0 JE @MAIN1 POP AX JMP @MAIN @MAIN1: LEA DX,LFCR MOV AH,9 INT 21H POP AX CALL DISPAXS MOV AH,4CH INT 21H ;===============================================; 键盘输入数值数组子程序(数组名为array,元素个数存放在num中) INPUTNUM PROC NEAR ; 输入的数据以一个空格分隔,以回车符结束输入 LEA DI,ARRAY ;将数组第一个元素的有效地址置入DI MOV WORD PTR[NUM],0 STIN: MOV AX,0 PUSH AX AGAIN1: MOV AH,1 INT 21H MOV BYTE PTR[CHAR],AL CMP AL,13 JE LINE0 CMP AL,' ' JE LINE0 SUB AL,30H MOV AH,0 MOV SI,AX POP AX MOV CL,10 MOV CH,0 MUL CX ADD AX,SI PUSH AX JMP AGAIN1 LINE0: POP AX MOV WORD PTR[DI],AX INC WORD PTR[NUM] CMP BYTE PTR[CHAR],13 JE STINEND INC DI INC DI JMP STIN STINEND: RET ARRAY DW 100 DUP(0) NUM DW 0 CHAR DB ? INPUTNUM ENDP ;================================================== ; 将要显示的有符号数置于 ax 中 DISPAXS PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH BP PUSH DS PUSH ES PUSHF PUSH CS POP DS PUSH CS POP ES MOV CX,6 LEA DI,DISPAXSS @DISPAXS: MOV BYTE PTR [DI],32 INC DI LOOP @DISPAXS PUSH AX MOV DL,32 MOV AH,2 INT 21H POP AX MOV BYTE PTR NZS,0 MOV BYTE PTR SIGNS,0 CMP AX,0 JGE @DISPAXS0 MOV BYTE PTR SIGNS,1 NEG AX @DISPAXS0: PUSH AX LEA SI,DIVARRS LEA DI,DISPAXSS INC DI MOV CX,5 @DISPAXS1: POP AX MOV DX,0 MOV BX,[SI] DIV BX PUSH DX CMP AL,0 JNE @DISPAXS2 CMP BYTE PTR NZS,1 JE @DISPAXS2 CMP CX,1 JE @DISPAXS2 MOV DL,20H JMP @DISPAXS3 @DISPAXS2: ADD AL,30H MOV DL,AL MOV BYTE PTR NZS,1 @DISPAXS3: MOV BYTE PTR[DI],DL INC SI INC SI INC DI LOOP @DISPAXS1 POP DX CMP BYTE PTR SIGNS,1 JNE @DISPAXS6 LEA SI,DISPAXSS ADD SI,5 @DISPAXS4: CMP BYTE PTR [SI],32 JE @DISPAXS5 DEC SI JMP @DISPAXS4 @DISPAXS5: MOV BYTE PTR [SI],'-' @DISPAXS6: LEA DX,DISPAXSS MOV AH,9 INT 21H POPF POP ES POP DS POP BP POP DI POP SI POP DX POP CX POP BX POP AX RET DIVARRS DW 10000,1000,100,10,1 NZS DB 0 SIGNS DB 0 DISPAXSS DB 32,32,32,32,32,32,'$' DISPAXS ENDP;============================================== CODE ENDS END START

楼主,你问的简单,“就编写一个这样的程序”,这个程序拿C语言编肯定非常简单,拿汇编可没那么容易啊。

以下是程序,简单说明几点:
1. 由于输入、输出的都是字符,所以用了两个函数。Atoi16是把输入的字符转为正整数,I16toa 是把整数转成字符串。
2. 调用Atoi16时,要配好si和cl两个寄存器。si为转换字符串的起始地址,cl为转换结束字符。例如输入两个数字,回车结束输入,而两个数字之间以空格分隔,比如1234 5678,那么第一次si指向1,cl为空格;第二次si指向5,cl为回车符,每次的转换结果以ax返回。
3. 调用I16toa函数时,把要转换的整数放到ax里,si指向存储转换结果的字符串起始位置。
4. 输入数字最好不要超过10000。当然超过10000也可以,比如输入 3456 2345,只要别让最终的计算结果超过65535就没问题。
5. 第一个大于val1又能整除val2的数为:((val1 / val2) + 1) * val2
dseg segment
LF equ 0ah
msg db 'Please input two numbers.', 0ah, 0dh, '$'
bufin db 20, 20 dup(?)
bufout db 10 dup(?)
val1 dw ?
val2 dw ?
dseg ends

cseg1 segment
assume cs:cseg1, ds:dseg
START:
mov ax, dseg
mov ds, ax

lea dx, msg
mov ah, 9
int 21h

lea dx, bufin
mov ah, 0ah
int 21h

mov dl, LF
mov ah, 2
int 21h

lea si, bufin + 2
mov cl, ' '
call Atoi16
mov val1, ax

inc si
mov cl, 0dh
call Atoi16
mov val2, ax

mov ax, val1
xor dx, dx
mov bx, val2
div bx
inc ax
mul bx


lea si, bufout
call I16toa
lea dx, bufout
mov ah, 9
int 21h

mov ah, 04ch
int 21h
cseg1 ends

cseg2 segment
assume cs:cseg2

Atoi16 proc far
xor ax, ax
xor bx, bx

Convert:
mov bl, [si]
mov dx, 10
mul dx
and bx, 0fh
add ax, bx
inc si
mov bl, [ si ]
cmp bl, cl
jne Convert

ret
Atoi16 endp

I16toa proc far
push ax
push bx
push cx
push dx
push si

mov bx, 10
xor cx, cx

next:
xor dx, dx
div bx
or dl, 30h
push dx
inc cx
cmp ax, 0
jnz Next

Store:
pop dx
mov [ si ], dl
inc si
loop Store
mov byte ptr[ si ], '$'
pop si
pop dx
pop cx
pop bx
pop ax

ret
I16toa endp

cseg2 ends
end START

        CODE  SEGMENT
              ASSUME    CS:CODE
              ORG       100H
      START:  JMP       BBB
        VAL1  DW        ?
        VAL2  DW        ?
        VAL3  DW        ?
        LFCR  DB        13,10,'$'
        BBB:  PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              CALL      INPUTNUM
              LEA       SI,ARRAY
              MOV       AX,[SI]
              MOV       VAL1,AX
              MOV       VAL3,AX
              MOV       AX,[SI+2]
              MOV       VAL2,AX

              MOV       BX,VAL2
              MOV       AX,VAL3
      @MAIN:  MOV       DX,0
              INC       AX
              PUSH      AX
              DIV       BX
              CMP       DX,0
              JE        @MAIN1
              POP       AX
              JMP       @MAIN
     @MAIN1:
              LEA       DX,LFCR
              MOV       AH,9
              INT       21H
              POP       AX
              CALL      DISPAXS
                            
              MOV       AH,4CH
              INT       21H

 ;===============================================
;  键盘输入数值数组子程序(数组名为array,元素个数存放在num中)
    INPUTNUM  PROC      NEAR
      ; 输入的数据以一个空格分隔,以回车符结束输入
              LEA       DI,ARRAY    ;将数组第一个元素的有效地址置入DI
              MOV       WORD PTR[NUM],0
       STIN:
              MOV       AX,0
              PUSH      AX
     AGAIN1:
              MOV       AH,1
              INT       21H
              MOV       BYTE PTR[CHAR],AL
              CMP       AL,13
              JE        LINE0
              CMP       AL,' '
              JE        LINE0
              SUB       AL,30H
              MOV       AH,0
              MOV       SI,AX
              POP       AX
              MOV       CL,10
              MOV       CH,0
              MUL       CX
              ADD       AX,SI
              PUSH      AX
              JMP       AGAIN1
      LINE0:
              POP       AX
              MOV       WORD PTR[DI],AX
              INC       WORD PTR[NUM]
              CMP       BYTE PTR[CHAR],13
              JE        STINEND
              INC       DI
              INC       DI
              JMP       STIN
    STINEND:
              RET
       ARRAY  DW        100 DUP(0)
         NUM  DW        0
        CHAR  DB        ?
    INPUTNUM  ENDP
              
;==================================================
 ; 将要显示的有符号数置于 ax 中
     DISPAXS  PROC      NEAR
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSH      SI
              PUSH      DI
              PUSH      BP
              PUSH      DS
              PUSH      ES
              PUSHF
              PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              MOV       CX,6
              LEA       DI,DISPAXSS
   @DISPAXS:
              MOV       BYTE PTR [DI],32
              INC       DI
              LOOP      @DISPAXS
              PUSH      AX
              MOV       DL,32
              MOV       AH,2
              INT       21H
              POP       AX
              MOV       BYTE PTR NZS,0
              MOV       BYTE PTR SIGNS,0
              CMP       AX,0
              JGE       @DISPAXS0
              MOV       BYTE PTR SIGNS,1
              NEG       AX
  @DISPAXS0:
              PUSH      AX
              LEA       SI,DIVARRS
              LEA       DI,DISPAXSS
              INC       DI
              MOV       CX,5
  @DISPAXS1:
              POP       AX
              MOV       DX,0
              MOV       BX,[SI]
              DIV       BX
              PUSH      DX
              CMP       AL,0
              JNE       @DISPAXS2
              CMP       BYTE PTR NZS,1
              JE        @DISPAXS2
              CMP       CX,1
              JE        @DISPAXS2
              MOV       DL,20H
              JMP       @DISPAXS3
  @DISPAXS2:
              ADD       AL,30H
              MOV       DL,AL
              MOV       BYTE PTR NZS,1
  @DISPAXS3:
              MOV       BYTE PTR[DI],DL
              INC       SI
              INC       SI
              INC       DI
              LOOP      @DISPAXS1
              POP       DX

              CMP       BYTE PTR SIGNS,1
              JNE       @DISPAXS6
              LEA       SI,DISPAXSS
              ADD       SI,5
  @DISPAXS4:
              CMP       BYTE PTR [SI],32
              JE        @DISPAXS5
              DEC       SI
              JMP       @DISPAXS4
  @DISPAXS5:
              MOV       BYTE PTR [SI],'-'
  @DISPAXS6:
              LEA       DX,DISPAXSS
              MOV       AH,9
              INT       21H
              POPF
              POP       ES
              POP       DS
              POP       BP
              POP       DI
              POP       SI
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
     DIVARRS  DW        10000,1000,100,10,1
         NZS  DB        0
       SIGNS  DB        0
    DISPAXSS  DB        32,32,32,32,32,32,'$'
     DISPAXS  ENDP
;==============================================   

        CODE  ENDS
              END       START



汇编语言 编写 程序 LED 灯显示
JZ RETURN ;读按键字符,ZF=1,则返回;ZF=0,则AL=字符 MOV AX,4C00H INT 21H ;返回DOS RETURN:RET BREAK ENDP CODE ENDS END START ;流水灯显示 MY8255_A EQU 0b860H;8255A口地址 MY8255_B EQU 0b861H;8255B口地址 MY8255_C EQU 0b862H;8255C口地址 MY...

汇编语言编写一个简单的电子秒表
MOV AH,1 ;等待键按下 INT 16H CLI ;关中断 MOV DX,SEG TIMER ;置新中断向量 MOV DS,DX MOV DX,OFFSET TIMER ;DS:DX=新中断向量(段:偏移)MOV AX,251CH INT 21H STI ;再开中断,以使键盘和INT1CH工作 CHECK: MOV AH ,1 ;检查有无键代码 INT 16H JZ DISPLAY1 ;无码可读,就...

用8086汇编语言编写程序,从键盘输入一段字符,以#结束,统计其中数字,字母...
为了简便,直接使用了21中断的输入字符串子功能,即使你不输入#作为结束符,也可以使用。统计时,则将'#'后面的字符忽略正确的作法,是调用21中断的1号子功能,每次读取一个字符,直到读取到'#'为止。这个修改很简单,我就不再写了。data segment buf db 255 ; db ? db 255 dup('$') ...

汇编是什么
1、嵌入式系统开发 许多嵌入式设备,如微控制器、传感器和电子设备,通常使用汇编语言进行程序设计。由于对性能和资源的极端要求,使用汇编语言可以更好地控制设备的功能和响应时间。2、驱动程序开发 操作系统或硬件设备的驱动程序通常需要与底层硬件进行直接交互,因此使用汇编语言编写驱动程序可以提供更好的...

汇编语言是一种什么程序设计语言
汇编语言是一种用于电子计算机、微处理器、微控制器或其他可编程设备的低级语言,也称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。同时,因为资源的稀缺性,计算机运行的效率也成为那个时代工程师追求的目标。为了更高效地使用计算机,人们设计了高级...

汇编语言编写钢琴程序
out 42h,al ;先写低8位 mov al,bh out 42h,al ;后写高8位 in al,61h ;读PB口当前状态 mov ah,al or al,03h ; 使PB0、PB1均为1,打开与门 out 61h,al ;接通扬声器 call hhh ; 调用 hhh mov al,ah and al,0fch ;使PB0、PB1均为0,关闭与门 out 61h,al ...

汇编语言编程
教你一个小招,用vc6.0编好一个c的程序,然后Alt+8可以查看汇编程序 1: #include <stdio.h> 2: void main(void)3: { 00401010 push ebp 00401011 mov ebp,esp 00401013 sub esp,5Ch 00401016 push ebx 00401017 push esi 00401018 push edi 0...

汇编语言从键盘输入一个的班级(每班不超过 60 人)某课程考试成绩,要求...
如果是只保留整数部分,且直接截断小数部分(不考虑舍入),网上有很多答案了。考虑舍入的话,你可先放大100倍,再进行处理。

汇编语言程序设计
汇编程序:把汇编语言书写的程序翻译成与之等价的机器语言程序的翻译程序。汇编程序输入的是用汇编语言书写的源程序,输出的是用机器语言表示的目标程序。汇编语言是为特定计算机或计算机系列设计的一种面向机器的语言,由汇编执行指令和汇编伪指令组成。采用汇编语言编写程序虽不如高级程序设计语言简便、直观,...

汇编语言程序设计
; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。Code Segment Assume CS:Code,DS:Code CR equ 000DH LF equ 000AH KBBack equ 0008H ; --- ; 功能:显示指定地址(Str_Addr)的字符串 ; 入口:; Str_Addr=字符串地址(要求在数据段); 用法: O...

宁安市13122858525: 求一个用汇编语言编写的“最简单的”从键盘输入两个数相加,得出结果,,我要完整的程序步骤,,,3Q -
员魏丽泉: data segment op1 dw ? op2 dw ? str1 db 'Please Input The 1st Number ',13,10, '$ ' str2 db 'Please Input The 2st Number ',13,10, '$ ' str3 db 'The Answer Is: ', '$ ' data ends code segment assume cs:code,ds:data start: main proc far push ds...

宁安市13122858525: 汇编语言实现键盘输入两个数并向加 -
员魏丽泉: 说说思路,很简单,我估计你也能想出来 键盘输入两个字符串,这个应该不难,dos中断调用可以搞定,再不麻烦点用BIOS中断调用,再不济也可以直接读取键盘端口. 然后将两个字符串转换成数值,这样相加比较容易,几条指令就可以,如用不转换也可以,这样就很麻烦了. 之后如果想要显示出来的话,再转换成字符串输出,可以用中断调用进行显示,直接写显存也可以显示.

宁安市13122858525: 用汇编语言实现从键盘输入两个2位数并进行相加,最后输出结果 -
员魏丽泉: DATAS SEGMENT ;数据段 DATA1 DB 31H,32H,38H,34H,37H ;定义DATA1为被加数 DATA2 DB 34H,35H,39H,37H,31H ;定义DATA2为加数 DATAS ENDS STACKS SEGMENT ;堆栈段 STA DB 64 DUP(0) ;(伪指令)为STA预留64个...

宁安市13122858525: 编写程序,从键盘上输入两个整数,然后计算它们相处后得到的结果并输出
员魏丽泉: #include<stdio.h>int main(){ int number1,number2,division; printf("请输入第一个整数:"); scanf("%d",&number1); printf("请输入第二个整数:"); scanf("%d",&number2); division = number1 / number2; printf("%d",division); getch(); return 0;}

宁安市13122858525: 如何用汇编实现从键盘上任意输入两个十进制数并求其和和显示 -
员魏丽泉: 这个程序能接受256个字符,如果你还想输入更多的字符,只需要把空间留的更多一点就行 data segment keyboard db 256 dup (?) ;为输入的字符串预留空间 data ends code segment assume cs:code,ds:data main proc far mov ax,data mov ...

宁安市13122858525: 用汇编语言写一个在键盘上任意输入两个数相加(十以内的)最好简单点三十行以内有有注释的我会提高赏金 -
员魏丽泉:[答案] Scanner i=new Scanner(System.in); int a=i.nextInt(); int b=i.nextInt(); if(a>100&&a100&&b

宁安市13122858525: 编写一个程序,从键盘输入两个整数,输出这两个数之和 -
员魏丽泉: 这才是正确的程序: #include<stdio.h> void main() { int a,b,sum; printf("请输入两个整数\n"); scanf("%d %d",&a,&b); sum=a+b; printf("the sum is:%d\n",sum); } 主函数一般是没有返回值的,应该用void;变量应该先定义,后使用,所以int a,b,sum;要放在 scanf("%d %d"&a,&b);的前面; Scanf那句引号后有个逗号; 输出sum的那一句,冒号:后面应该加个%d ; 还有就是,你main错写成mian了.

宁安市13122858525: 由键盘输入两个整数a、b,输出稍大于a而是b的整数倍的数 汇编语言编程 -
员魏丽泉: 汇编语言实现,请发[汇编语言]区!输出大于a的b的最小倍数? 若是 算法: ((a%b)+1)*b

宁安市13122858525: 计算机写程序:从键盘上输入任意两个整数、按由大到小的顺序输出 -
员魏丽泉: C# //读入两个参数 ConsoleKeyInfo a = Console.ReadKey(); ConsoleKeyInfo b = Console.ReadKey(); //如果a的值大于b,输出ab,否则输出ba if(a.Key>=b.Key) { Console.WriteLine(a.Key.toString()+","+b.Key.toString()); }else{ Console....

宁安市13122858525: 用汇编语言设计一个加法运算程序,它能在屏幕提示下,要求用户任意输入两个整数,相加后能将结果输出显示 -
员魏丽泉: #include<stdio.h> main() { long int a,b,c; printf("任意输出两个zd整数a,b:"); scanf("%d%d",&a,&b); c=a+b; printf("c=%d\n",c); } 不喜欢就当我练练手了

你可能想看的相关专题

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网