彙編學習小記(二 順序程式設計

2021-09-11 14:20:08 字數 3889 閱讀 2817

20180411第二次實驗總結

[注意⚠️] 1.二進位制目標檔案obj結尾

但是如果想要全部都變為小寫,則需要使用迴圈,不然就只能改變第乙個的大小寫

data segment

buffer db 20,?,21 dup('$')

data ends

code segment

assume cs:code,ds:data

start:

mov ax,seg buffer

mov ds,ax

mov dx,offset buffer

mov ah,10

int 21h

mov buffer[0],0dh

mov buffer[1],0ah

mov ax,seg buffer

mov ds,ax

mov dx,offset buffer

mov ah,9

int 21h

mov ah,4ch

int 21h

code ends

end start

複製**

葭葭葭葭葭葭葭  23:55:11

data segment

data ends

code segment

assume cs:code,ds:data

start:

;把es賦值為b800

mov ax,0b800h

mov es,ax

;獲取對應的游標位置(int 10的3號功能為游標位置)

mov bl,0

mov ah,3

mov bh,0

int 10h

;行號儲存在dh中,列號儲存在dl中

;位置=dh*160+dl*2

mov al,160

;將dh與al, 結果放在ax

mul dh

mov dh,0

shl dl,1

add ax,bx

mov bx,ax

;打出 ajiajia

mov al,41h

mov es:[bx+0],al

mov byte ptr es:[bx+1],1eh

mov al,6ah

mov es:[bx+2],al

mov byte ptr es:[bx+3],1eh

mov al,69h

mov es:[bx+4],al

mov byte ptr es:[bx+5],1eh

mov al,61h

mov es:[bx+6],al

mov byte ptr es:[bx+7],1eh

mov al,6ah

mov es:[bx+8],al

mov byte ptr es:[bx+9],1eh

mov al,69h

mov es:[bx+10],al

mov byte ptr es:[bx+11],1eh

mov al,61h

mov es:[bx+12],al

mov byte ptr es:[bx+13],1eh

code ends

end start

複製**

區分舉例:十進位制數 9和15

非壓縮bcd碼

解法一:我最開始的做法,但輸出超過兩位數就發生了錯誤

data segment

mess db 'y=2x+3,please input x : $'

show db 'y=2x+3= $'

data ends

code segment

assume cs:code,ds:data

start:

; 將資料端的段位址賦給ds

mov ax,data

mov ds,ax

;提示資訊的顯示

mov dx,offset mess

mov ah,9

int 21h

;鍵盤輸入 輸入後的值放在al中

mov ah,1

int 21h

sub al,30h ;去掉ascii碼

mov ah,0 ;防止對資料結果造成影響

shl al,1 ;乘2後的結果就放在al中

add al,3 ;加3

mov bl,al ;儲存資料

add bl,30h ;加上ascii碼

;顯示「y=2x+3=」,在此之前加入回車換行

mov ah,2

mov dl,0ah

int 21h ;換行

mov dx,offset show

mov ah,9

int 21h

;輸出結果

mov ah,2 ;這句話必須有,不然會出現很多奇怪的

mov dl,bl

int 21h

mov ah,4ch

int 21h

code ends

end start

複製**

實現效果:

解法二:運用aam,結果是一位數的時候是正常的,但是當結果是兩位數的時候,比如輸入 4 應該輸出 11 ,但結果就開始亂了

複製**
實現效果:

mess2 db 0ah,0dh,'y=2x+3=$'

複製**

由於非壓縮的bcd碼用乙個位元組表示乙個十進位制數,調整後若加上30h 就是該數值的ascii碼

所以aaa的含義為加法執行後可以調整為ascii

data segment

mess db 'y=2x+3,please input x : $'

show db 'y=2x+3= $'

data ends

code segment

assume cs:code,ds:data

start:

;將資料端的段位址賦給ds

mov ax,data

mov ds,ax

;提示資訊的顯示

mov dx,offset mess

mov ah,9

int 21h

;鍵盤輸入 輸入後的值放在al中

mov ah,1

int 21h

sub al,30h ;去掉ascii碼

mov ah,0 ;防止對資料結果造成影響

shl al,1 ;乘2後的結果就放在al中

aamadd ax,3h ;加3

aaaadd ax,3030h ;加上ascii碼

mov bx,ax ;儲存資料

;顯示「y=2x+3=」,在此之前加入回車換行

mov ah,2

mov dl,0dh ;回車

int 21h

mov dl,0ah

int 21h ;換行

mov dx,offset show

mov ah,9

int 21h

;輸出結果

mov ah,2

mov dl,bh

int 21h

mov dl,bl

int 21h

mov ah,4ch

int 21h

code ends

end start

複製**

實現效果如下

1.如果要寫十六進製制的,就需要帶著h。這裡的加3,寫為 add ax,3h 可行,寫為 add ax,3 仍舊可行的原因是 :3和3h在ascii表上表示的是同乙個字元,但是 33可和33h不一樣了啊

二 順序程式設計

1 空語句 空語句什麼也不執行,相當於乙個回車 2 用到輸入輸出時需要加 include printf和scanf除外 3 putchar 字元輸出函式 例 putchar a 輸出a putchar 101 輸出a 使用時必須加標頭檔案 include 4 getchar 鍵盤輸入函式 例 cha...

彙編學習 二

如果要能編譯和執行asm檔案,則必須安裝masmsdk2.建立visual c 空白工程 3.新建asm檔案 這是網上摘錄的 mymain.asm.386 model flat,stdcall option casemap none include windows.inc include kerne...

彙編學習 二

1.jmp 改變eip的值。最大區別 會改變esp 棧頂 1.cmp指令 該指令是比較兩個運算元,實際上,它相當於sub指令,但是相減的結構並不儲存到第乙個運算元中。只是根據相減的結果來改變零標誌位的,當兩個運算元相等的時候,零標誌位置1。可以用來判斷兩個數是否相等 cmp eax,eax 看zf,...