小弟也是初来乍到,大家一起学习一下,
这是第一个程序,看不清楚的欢迎提问:
datasegment
bufdb100,-120,1,2,4
countequ$-buf
dataends
codesegment
assumeds:data,cs:code
start:movax,data
movds,ax
movbl,buf
cmpbl,0
jglab
negbl
lab:movcx,count-1
leasi,buf+1
next:moval,[si]
cmpal,0
jglab1
negal
lab1:cmpbl,al
jblab2
movbl,al
lab2:incsi
loopnext
movch,2
movcl,4
print:rorbl,cl
movdl,bl
anddl,0fh
adddl,30h
cmpdl,39h
jbprt
adddl,7
prt:movah,2
int21h
decch
jnzprint
exit:movah,4ch
int21h
codeends
endstart
这是第二个程序,(这是在输入的整数小于225情况下成立的,满足要求)
datasegment
bccddb?
dataends
codesegment
assumecs:code,ds:data
start:movax,data
movds,ax
movbx,0
new:movah,1
int21h
subal,30h
jbexit
cmpal,9
jaexit
xchgal,bl
movcl,0ah
mulcl
xchgal,bl
addbl,al
jmpnew
exit:movbccd,bl
movah,4ch
int21h
codeends
endstart
这是第五个程序,采用除十取余法,以下是代码:codesegment
assumecs:code
start:movch,2
movcl,4
new:movah,1
int21h
subal,30h
cmpal,30h
jblab
subal,27h
lab:shlbl,cl
orbl,al
decch
jnznew;输入一个两位十六进制数
movch,2;转换为十进制
movcl,4
movdl,10
moval,bl
movbl,0
retry:shrbl,cl
movah,0
divdl;dl放除数10
rorah,cl
orbl,ah
decch
jnzretry
movch,2;输出
movcl,4
movdl,al
adddl,30h
movah,2
int21h
print:rolbl,cl
movdl,bl
anddl,0fh
adddl,30h
movah,2
int21h
decch
jnzprint
exit:movah,4ch
int21h
codeends
endstart
(这个程序的一个小缺点就是没有容错处理,但是默认输入正确,所以还是符合要求的)
以上程序均经过调试
老哥太累了啊,明天接着编
第四道题目其实和第二道差不多,存在内存中的二进制其实就是十六进制,只要将第二道循环两遍就可以
第三道嘛方法和前面的差不多,其实说到底就是把十六进制转换为十进制,就是在输入的时候比较麻烦。我就说下方法吧:用一个循环次数为8的循环输入,第一次输入的比如是1的话,减去30h,乘以2^7,加到寄存器BX里面;第二次同样的,只不过是乘以2^6,加到BX里面,依次类推,就可以把输入的8个1,0转换为是十六进制,后面的工作就是把十六进制转换为是十进制输出,和前面的一样
希望回答的够清楚,欢迎探讨啊