輸入乙個數n,對1到n的所有自然數求和
程式執行:
mov ax,datas ;初始化ds
mov ds,ax
;輸入提示
lea dx,input
mov ah,9
int 21h
;輸入n
lea dx,n_string_max_length
mov ah,10
int 21h
;轉換成為數字
lea si,n_string
call todigit
mov n,ax
mov ax,0
mov dx,0
mov cx,n ;迴圈的次數
mov bx,1 ;求和從一開始
s:add ax,bx ;求和
adc dx,0
inc bx
loop s
mov word ptr sum,ax ;儲存求和的結果
mov word ptr sum+2,dx
lea dx,output ;輸出提示
mov ah,9
int 21h
mov ax,word ptr sum ;輸出求和
mov dx,word ptr sum+2
call print_decimal
retmain endp
todigit proc near uses bx cx dx si di
;si ,ax
mov cl,[si] ;設定迴圈次數
xor ch,ch
inc si ;si指向第乙個元素
mov ax,0 ;初始化ax,dx
mov dx,0
mov di,10 ;除數
dig:
mov bl,[si]
cmp bl,'0' ;判斷是否小於'0'
jb err ;若低於'0',則錯誤字元
cmp bl,'9' ;判斷是否大於'9'
ja err ;若高於'9',則錯誤字元
sub bl,30h ;否則,將數字字元轉成數字
xor bh,bh
mul di ;乘十
add ax,bx ;加上個位
adc dx,0
inc si
loop dig
cmp dx,0 ;判斷高位是否為0
jnz err ;若不為0,錯誤
jmp exit
err: ;輸出錯誤
push ds
push cs
pop ds
lea dx,error_tip
mov ah,9
int 21h
pop ds
mov ah,4ch
int 21h
exit:
ret
error_tip db 0dh,0ah,'input error$'
todigit endp
print_decimal proc near uses ax bx cx dx
mov bx,10
mov cx,0
dea:
div bx
push dx
inc cx
xor dx,dx
cmp ax,0
jnz dea
dea1:
pop dx
add dl,30h
mov ah,2
int 21h
loop dea1
ret
print_decimal endp
codes ends
end main
第二十六期 openEuler組合語言(2)
上一期中我們介紹了一些arm組合語言的程式設計方法,這一期我們介紹一下arm內嵌彙編器並嘗試分析一下openeuler中的一段彙編 c c 編譯器中包含了內嵌彙編器,使用這些內嵌彙編器可以在c或c 中使用大部分arm指令和thumb指令。內嵌彙編指令中,作為運算元的暫存器和常量可以是c或c 表示式,...
組合語言(二十三)之求乙個數的補數
給定乙個數,求該數的補數 程式執行 mov ax,datas 初始化ds mov ds,ax 輸出原始的num lea dx,outputnum mov ah,9 int 21h mov bl,n xor bh,bh dec bx os mov al,num bx call hexidemical ...
組合語言(二十一)之數值交換與自增
輸入兩個數,如果第乙個數為偶數第二個數為奇數,互換位置 如果兩個數都是奇數,則兩個數都加一 程式執行 mov ax,datas 初始化ds mov ds,ax 輸入a提示 lea dx,inputa mov ah,9 int 21h 輸入a lea dx,a string mov ah,10 int...