組合語言實現鍵盤輸入兩個數並向加

2021-03-07 10:26:32 字數 8004 閱讀 6394

1樓:匿名使用者

data segment

max equ 20

num1 db max , ? , max dup(0)

num2 db max , ? , max dup(0)

input db 0ah , 0dh , 'please input a number : $'

sum db 0ah , 0dh , max dup(0) , '$'

data ends

stack segment stack

db 200 dup(0)

stack ends

code segment

assume ds:data , cs: code , ss: stack

start :

mov ax , data

mov ds , ax ;

mov dx , offset input

mov ah , 9

int 21h ; 輸入提示

mov dx ,offset num1 ;

mov ah,10

int 21h ; 輸入第乙個數

mov dx , offset input

mov ah , 9

int 21h ; 輸入提示

lea dx , num2 ;

mov ah , 10

int 21h; 輸入第二個數

mov al , num1 + 1

mov ah , 0

mov si , ax ; 初始化第乙個數

mov al , num2 + 1

mov ah , 0

mov di , ax ; 初始化第二個數

mov bx , offset [sum + 2 + max - 1] ; 指向最後乙個位元組 ...

cmp si , di

jge m

mov cx , di ; 去最大值

jmp lopa ; 匯聚

m :mov cx , si ;

lopa : ; 迴圈計算開始

cmp si , 0

je onezero ; 跳轉到第乙個數為零處

mov al , [num1+si + 1] ;

dec si

jmp one

onezero :

mov al , '0'

one : ; // al 中為第乙個數值

cmp di , 0

je twozero ; 為零就不操作加

add al , [num2+di + 1 ] ; 兩個數度不為零的處理

sub al , '0'

dec di

twozero :

cmp al , '9'

jle nodispose ; 不做處理

inc byte ptr [bx-1] ; 進製

sub al , 10 ; 減去進製1

nodispose :

add [bx] , al

dec bx

dec cx

jne lopa ;

mov [bx] , byte ptr 0dh

dec bx

mov [bx] , byte ptr 0ah

mov dx , bx

mov ah ,9

int 21h ;

mov ah , 1 ; 暫停程式

int 21h

mov ah , 4ch ; // 退出程式

int 21h

code ends

end start

max 是數的位數自己改下

2樓:匿名使用者

位數不固定是不行的,只能說你定義的記憶體可以存放的範圍很大,能滿足一般情況即可。

然後就是把資料存起來,兩次的數相加即可了

3樓:匿名使用者

說說思路,很簡單,我估計你也能想出來

鍵盤輸入兩個字串,這個應該不難,dos中斷呼叫可以搞定,再不麻煩點用bios中斷呼叫,再不濟也可以直接讀取鍵盤埠.

然後將兩個字串轉換成數值,這樣相加比較容易,幾條指令就可以,如用不轉換也可以,這樣就很麻煩了.

之後如果想要顯示出來的話,再轉換成字串輸出,可以用中斷呼叫進行顯示,直接寫視訊記憶體也可以顯示.

4樓:手機使用者

我從來沒見過這麼不懂表達表達的提問者,居然還有人答覆了好幾次的。。。

拜託,,你就不能發個例子,,讓我們看看你想完成什麼樣的效果如果你想實現123+32=155的話,那太簡單了,,我都不忍心說出來了

如果你想實現123+32=443的話,,也有辦法哦 ,可是你看看你問題的表達,反正我看不懂

用組合語言實現從鍵盤輸入兩個2位數並進行相加,最後輸出結果

5樓:匿名使用者

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個位元組的儲存空間

sp_top db 0 ;定義sp_top單元的數值為0

stacks ends

codes segment ;**段

assume cs:codes,ds:datas,es:datas,ss:stacks

start:

mov ax,datas

mov ds,ax ; 設定資料段

mov ax,stacks

mov ss,ax ; 設定堆疊段

lea sp,sp_top ; 設定棧頂指標

mov si,offset data1 ;把data1偏移量位址賦予si

mov bx,05 ;

call displ ; 顯示被加數

call crlf ; 回車、換行

mov si,offset data2 ; 把data2偏移量位址賦予si

mov bx,05 ;

call displ ; 顯示加數

call crlf ; 回車、換行

mov di,offset data1 ; 把data1偏移量位址賦予di

call adda ;呼叫adda子程式,實行加法運算

mov bx,05 ;

call displ ; 顯示結果

call crlf ; 回車、換行

mov ax,4c00h ;

int 21h ;呼叫dos21h功能,返回

crlf proc near ;回車、顯示功能過程定義,屬性為near

mov dl,0dh ;把回車的ascii碼0dh傳給dl

mov ah,02h ;送dos 的中斷呼叫功能號

int 21h ; dos 的中斷呼叫

mov dl,0ah ; 把換行的ascii碼0ah傳給dl

mov ah,02h ; 送dos 的中斷呼叫功能號

int 21h ; dos 的中斷呼叫

ret ; 返回

crlf endp ;完成過程定義

displ proc near ;顯示功能過程定義,屬性為near

dsl: mov ah,02 ;送顯示功能號

mov dl,[si+bx-1] ;顯示字串中一字元

int 21h ; dos 的中斷呼叫

dec bx ;bx減1,修改偏移量

jnz dsl ;如果bx未減到零,跳到dsl執行指令

ret ;返回

displ endp ;完成顯示功能子程式定義

adda proc near ;實行加法運運算元程式過程定義,屬性為near

mov dx,si

mov bp,di

mov bx,05

tran_hex: sub byte ptr[si+bx-1],30h ;把ascii碼數轉化為十六進製制

sub byte ptr[di+bx-1],30h

dec bx ; bx減1,修改偏移量

jnz tran_ hex ; 如果bx未減到零,跳到tran_ hex執行指令

mov si,dx

mov di,bp

mov cx,05 ; 包括進製,共5位

clc ;進製標誌位cf清零 (clear carry flag)

the_add: mov al,[si]

mov bl,[di]

adc al,bl ; 帶進製相加,把結果存在ax

aaa ;進行aaa調整,非結合bcd碼的加法調整

mov [si],al ; 結果送被加數區

inc si ;si加1

inc di ;di加1(指向下一位)

loop the_add ;迴圈

mov si,dx

mov di,bp

mov bx,05

tran_asci: add byte ptr[si+bx-1],30h

add byte ptr[di+bx-1],30h

;使用ptr轉換屬性並相加,將十六進製制數轉化為ascii表示

dec bx ; bx減1,修改偏移量

jnz tran_asci ; 如果bx未減到零,跳到tran_asci 執行指令

ret ;返回

adda endp ;加法子程式定義完成

codes ends ;**段完成

end start

6樓:匿名使用者

crlf macro ;定義回車換行的巨集命令 巨集指令名crlf

mov dl,0dh

mov ah,02h

int 21h ;int 21h 執行功能呼叫

mov dl,0ah

mov ah,02h

int 21h

endm

data segment ;定義資料段 segment定義段,段名為segment

data1 db 20 dup(?) ;加數

data2 db 20 dup(?) ;被加數

data ends

stack segment ;堆疊段

sta db 20 dup(?)

top equ length sta

stack ends

code segment ;程式段

assume cs:code,ds:data,ss:stack,es:data ;assume規定段所屬的段暫存器

start: mov ax,data ;資料段位址ds

mov ds,ax

mov ax,stack ;確定堆疊

mov ss,ax

mov ax,top

mov sp,ax

mov bx,02

mov si,offset data1 ;設定指標

call input ;呼叫輸入函式input

crlf

mov bx,02 ;呼叫輸入函式

mov si,offset data2

call input

crlf

crlf

mov si,offset data2 ;顯示被加數

mov bx,02 ;2位

call displ

crlf

mov si,offset data1 ;取加數字址,顯示加數

mov bx,02

call displ

crlf

mov di,offset data2 ;取被加數首址

call adda ;執行加法

mov si,offset data1 ;顯示結果

mov bx,02

call displ

crlf

mov ax,4c00h ;程式結束 返回dos

int 21h

displ proc near ;proc指示過程開始,過程名proc near定義近指標

dsi: mov ah,02

mov dl,[si+bx-1]

int 21h ;這三句為顯示輸出,被輸出的字元送dl

dec bx

jnz dsi

ret ;返回dos,不過是有條件的,

displ endp

adda proc near

mov dx,si

mov bp,di

mov bx,02

ad1: sub byte ptr[si+bx-1],30h ;byte指示位元組長度的運算元 byte ptr

sub byte ptr[di+bx-1],30h

dec bx

jnz ad1

mov si,dx

mov di,bp

mov cx,02

clcad2: mov al,[si]

mov bl,[di]

adc al,bl

aaamov [si],al

inc si

inc di ;inc加,dec減

loop ad2

mov si,dx

mov di,bp

mov bx,02

ad3: add byte ptr[si+bx-1],30h

add byte ptr[di+bx-1],30h

dec bx

jne ad3

retinput proc near ;函式的輸入

in1:mov ah,01

int 21h ;這兩句,從鍵盤輸入數,並回顯 字元到al,al中為ascii碼

mov [si],al

inc si

dec bx

jnz in1 ;in1為0時迴圈結束

retinput endp

adda endp

code ends

end start

怎麼使用組合語言實現,利用定時器使數碼管的計數一次顯示不同的數字。這是我編寫的程式

題目寫清楚些,到底是用定時計數器來實現數值變化,還是用按鍵來實現。沒有呼叫子程式 你用了乙個ret org 0000h mov tmod,06h mov th0,0 mov tl0,0 mov r7,15 setb tr0 mov dptr,table s1 mov a,tl0 movc a,a d...

組合語言題目從鍵盤上輸入0 9之間的任意數字,利用查表的方法計算其平方值,並將計算的結果在

data segment buffer db 0 0h 1 1h 4 4h 9 9h 16,10h db 25,19h 36,24h 49,31h 64,40h 81,51h mub db 0 data ends code segment assume cs code,ds datastart mo...

c語言 從鍵盤輸入兩個整數,輸出這兩個整數的差

如下 include stdio.h void main c語言是一門通用計算機程式語言,應用廣泛。c語言的設計目標是提供一種能以簡易的方式編譯 處理低階儲存器 產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。儘管c語言提供了許多低階處理的功能,但仍然保持著良好跨平台的特性,以乙個標準...