彙編學習 5

2021-08-28 21:57:35 字數 3613 閱讀 2364

1.統計字串長度,將結果按十六進製制字串格式輸出

要求:使用重複字首和條件設定指令

char s_23[81];

char len[81];

printf("s = ");

scanf("%s", s_23);

_asm

printf("s的長度為(十六進製制):%s h\n", len);

//子程式s_len

//功能:獲取字串長度

//返回值: eax 字串長度

s_len:

mov edi, ecx

push ecx //保護ecx

xor eax, eax //置零eax,即終止符'\0'

mov ecx, 0xffffffff

repnz scasb

not ecx

dec ecx //減去終止符的長度

mov eax, ecx //設定返回值

pop ecx

ret

//子程式h2ascll

//功能:利用條件設定指令把一位十六進製制數轉化為對應ascll碼值

//引數:ecx 待處理數

//返回值:eax ascll碼值

h2ascll:

push ebx

push edx

mov eax, ecx

//檢測第3位和第1位是否為1

bt cx, 3

setc bl

bt cx, 1

setc dl

and bl, dl

je is_hex_number

add eax, 7

is_hex_number:

add eax, 48

//平衡堆疊

pop edx

pop ebx

ret

2.輸入兩個十六進製制數字串,轉化為數,求和、差,再按十進位制數字串格式輸出

char s_hex1[81], s_hex2[81];

char s_sum[81], s_diff[81];

printf("輸入兩個十六進製制數字串\n");

printf("hex1 = ");

scanf("%s", s_hex1);

printf("hex2 = ");

scanf("%s", s_hex2);

int a4,b;

_asm

printf("和為:%s h\n", s_sum);

printf("差為:%s h\n", s_diff);

//子程式hstr2d_plus

//功能:將十六進製制字串轉化為資料,並考慮前導空格

//返回值:eax 轉化後的資料

hstr2d_plus:

push ebx

push edx

push edi

xor eax, eax //eax置零

mov edi, 16 //乘數為16

//刪除前導空格

is_blank:

lodsb

mov cl, al

call judge_hex

test eax, eax

cmp cl, ' '

je is_blank

dec esi

//開始轉化

l_hstr2d_plus:

mov bl, [ecx] //取下乙個字元

inc ecx

test bl, bl //若為終止符,結束迴圈

je end_hstr2d_plus

mul edi //乘16

//將十六進製制字元轉化為對應數字值

sub bl, 48

cmp bl, 10

jb not_char

sub bl, 7

not_char:

movzx ebx, bl

add eax, ebx

jmp l_hstr2d_plus

end_hstr2d_plus:

//平衡堆疊

pop edi

pop edx

pop ebx

ret

//子程式judge_hex

//功能:判定字元是否為十六進製制字元

//引數:ecx 待處理字元

//返回值:eax 判定結果,1表示是十六進製制字元,0表示不是

judge_hex:

xor eax, eax //eax置零

cmp cl, '0'

jb end_judge

cmp cl, '9'

jbe is_hex

cmp cl, 'a'

jb end_judge

cmp cl, 'z'

jbe is_hex

cmp cl, 'a'

jb end_judge

cmp cl, 'z'

ja end_judge

is_hex:

inc eax

end_judge:

ret

//子程式d2hstr

//功能:將資料轉化為十六進製制字串

d2hstr:

//初始化

mov ebx, ecx

push edi

mov edi, edx

mov ecx, 8

l: mov eax, 0xf0000000

and eax, ebx //取出高4位

shr eax, 28

shl ebx, 4

cmp al, 10 //判斷對應十六進製制是數字還是字母

jl number_d2hstr

add al, 7 //如果對應十六進製制是字母,則多加7

number_d2hstr:

add al, 48 //轉化為對應ascll碼值

stosb

loop l

mov eax, 0

stosb

pop edi

ret

3.輸入四個整數,視為128位資料,求1的個數(位操作)

unsigned int a[5];

int count;

printf("輸入四個整數:");

for(int i=0; i<4; i++)

scanf("%u", &a[i]);

_asm

printf("1的個數為:%d\n", count);

4.輸入乙個字串,視為位串,求連續為0的最大長度(位操作)

char s_26[81];

unsigned int n;

printf("輸入任意字串:");

scanf("%s", s_26);

_asm

printf("連續為0的最大長度為: %d", n);

彙編學習 NO5

1.ret 用棧中的資料,修改ip的內容,從而實現近轉移.2.retf 用棧中的資料,修改cs和ip的內容,從而實現遠轉移.3.可以修改ip,或同時修改cs和ip的指令統稱為轉移指令 4.只修改ip時,稱為段內轉移 同時修改cs和ip時.稱為段間轉移 5.由於轉移指令對ip修改範圍不同,段內轉移又分...

彙編基礎學習5

文章 http www.mcany.cn article 280.htm 博主 沒落的殘陽 今天我給大家來講解下我們記憶體中資料的儲存以及訪問。這節課的基礎也是非常重要的。因為80386的資料位址線是32根,所以它一次可以傳送資料是4個位元組。所以我們記憶體單元是按照4個位元組來對齊的。用高階語言的...

彙編學習筆記5

在筆記4裡,有兩個概念混淆不清,即儲存器和暫存器.8086,8088系統共有14個16位暫存器和8個8位暫存器,其中,bx,si,di,sp都可用於暫存器指標,預設情況下與ds匹配使用。bp也可用於暫存器指標,預設情況下與ss匹配使用。8086,8088cpu共有20根匯流排,可定址範圍為2 20個...