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個...