彙編實驗 有符號數輸入且存入記憶體並判斷負數個數

2021-10-10 06:01:10 字數 3862 閱讀 1302

**

一.實驗目的

1、掌握迴圈程式的結構;

2、學習綜合程式的設計、編寫及除錯;

二.實驗內容

1、計算s=12+23+34+。。。+n(n+1);

2、求某個資料區內負數的個數;

三.試驗程式

1、

datas segment

result dw ? ;計算結果

dval db 5 dup(?);申請緩衝區,存放轉換後的資料

dlen =$-result ;位址偏移量

datas ends

codes segment

assume cs:codes,ds:datas

start:

mov dx,0001h

mov bl,02h

a0:

mov al,bl

inc bl

mul bl

add dx,ax ;結果存於dx中

cmp ax,00c8h ;判斷n(n+1)與200的大小

jb a0

mov ax,datas ;儲存計算結果

mov ds,ax

mov result,dx

;16進製制轉10進製輸出

mov si,offset result;資料源位址

mov dx,[si]

mov si,offset dlen;目標資料位址 offset送回偏移位址

a1:

dec si;自減

mov ax,dx

mov dx,0

mov cx,10;除數10

div cx;商送ax,餘數dx

xchg ax,dx;資料交換

mov [si],al;存入目標位址

cmp dx,0000h

jne a1;判斷轉換結束否,未結束轉a1 不等跳轉

a2:

cmp si,offset dval;與目標位址的首址比較

jz a3;等於首位址轉a3,否則將剩餘位址填00h 等0跳轉

dec si

mov al,00h

mov [si],al

jmp a2

a3:

mov cx,5 ;迴圈次數

mov si,offset dval;目標資料位址 offset送回偏移位址

mloop:

mov al,[si];將si位址的數依次賦值給al

inc si

add al,30h ;ascii碼

mov dl,al ;輸出

mov ah,2

int 21h

loop mloop ;迴圈

mov ah,4ch

int 21h

codes ends

end start

2、

datas segment

msg0 db 'number of all nums:$'

msg1 db 10,13,'please input a num:$'

msg2 db 10,13,'number of negative nums is $'

buf dw ?;首單元為總數

result db ? ;統計後的負數個數

datas ends

stacks segment

;此處輸入堆疊段**

stacks ends

codes segment

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

start:

mov ax,datas

mov ds,ax

lea dx,msg0 ;msg0位址存入dx

mov ah,9 ;顯示字串

int 21h

mov ah,1

int 21h ;輸入資料個數

mov ah,0

sub al,48

mov cx,ax

push cx

mov si,offset buf

again:

lea dx,msg1 ;msg1位址存入dx

mov ah,9 ;顯示字串

int 21h

call input

mov [si],bx

add si,2

loop again

mov di,offset buf ;資料區首位址

pop cx

mov bl,0

a1:

mov ax,[di]

test ax,1000000000000000b ;檢查資料首位是否為1

jz a2

inc bl ;負數個數加1

a2:

add di,2

loop a1

lea dx,msg2 ;msg2位址存入dx

mov ah,9 ;顯示字串

int 21h

mov di,offset result ;存結果

mov [di],bl

add bl,48

mov dl,bl

mov ah,2

int 21h

mov ah,4ch

int 21h ;程式終止

input proc

push ax

push cx

xor bx,bx

xor cx,cx ;置0 bx儲存結果 cx是正負標誌

xor dx,dx

in0:

mov ah,1

int 21h ;輸入

cmp al,'+'

jz in1 ;正數 繼續輸入

cmp al,'-'

jnz in2

mov cx,1 ;負數 cx置1

in1:

mov ah,1 ;繼續輸入

int 21h

in2:

cmp al,'0'

jb in3

cmp al,'9'

ja in3 ;<0 >9 結束

sub al,48

mov ah,0

push ax

mov ax,bx

mov dl,10

imul dx

pop ax

add bx,ax

jmp in1

in3:

cmp cx,0 ;判斷正負數

jz in4

neg bx ;負數求補

in4:

pop cx

pop ax

retinput endp

codes ends

end start

四.試驗中遇到的問題、試驗結果分析

實驗一很簡單!沒有問題!

實驗二求負數個數的一開始沒理解怎麼存進去記憶體,後來問了老師也清楚了!還有就是寫**的時候,如果使用暫存器計數或者什麼,一定要記得置0!!!尤其是你一開始存到al後邊用ax的時候,記得把ah置0!!我就是因為置0的問題,一直輸出不正確,看了**好長時間才發現!!

五.實驗總結與體會

通過本次對迴圈問題的求解,使我更加熟悉了跳轉、迴圈等指令的使用。還結合了前面輸入輸出的內容,溫故知新。使用了新指令:neg。自己寫程式時老是犯一些比較低階的小錯,要注意。

有符號數與無符號數

關於有符號數和無符號數的一些重要知識點,包括它們在記憶體中的儲存方式 互相轉換 越界計算等。大家肯定都知道,對於有符號數,資料型別的最高位用於標示資料的符號,最高位為1表示負數,最高位為0表示正數,那麼今天我們主要就此討論乙個問題 在計算機內部具體是如何表示有符號數呢?在計算機內部是通過補碼的方式來...

有符號數和無符號數

有符號和無符號整數 1.通常情況下,大多數字預設的是有符號數,比如 4,5 要想寫乙個無符號數必須在後面加u 比如 4u,5u 2.在計算機中有符號數是用補碼的形式來表示的,最高位是符號位。無符號數就是正數唄 正數的補碼和原碼相同。比如 1 在計算機中表示為 11111111 11111111 11...

無符號數和有符號數

人有十個手指頭,習慣了逢十進一,於是十進位製成了生活中的標準。程式的世界只有高低電平兩種狀態,更適合用二進位制來表示,於是二進位製成了程式世界的標準。對與無符號數來說,我們更喜歡談他們之間的轉化,十進位制是我們最習慣的進製,於是十進位制轉為r進製,r進製轉為十進位制變尤為重要。十進位制 r進製 整數...