问题–编写汇编语言程序来检查给定的16位数字是否是回文。如果数字是回文,则将01存储在存储位置3050中,否则将FF存储在存储位置3050中。
注–回文数是数字相反的数字。
假定用于检查回文的16位数字存储在内存位置2050中。
例子 –
算法 –
- 将存储器单元2050的内容加载到寄存器L中,并将存储器单元2051的内容加载到寄存器H中
- 将L的内容移至累加器A中
- 通过执行4次RLC指令来反转A的内容
- 在L中移动A的内容
- 在A中移动H的内容
- 通过执行4次RLC指令来反转A的内容
- 将L的内容移至H
- 在L中移动A的内容
- 将L的内容存储在内存位置2070中并将H的内容存储在内存位置2071中
- 将内存位置2050的内容加载到A中
- 将A的内容移到寄存器B中
- 将内存位置2070的内容加载到A中
- 比较A和B的内容。如果内容不同,则将FF存储在A中并将其存储在内存位置3050
- 如果A和B的内容相同,则将内存位置2051的内容加载到A中
- 在B中移动A的内容
- 将内存位置2071的内容加载到A中
- 比较A和B的内容。如果内容不同,则将FF存储在A中并将其存储在内存位置3050
- 如果A和B的内容相同,则将01存储在A中并将其存储在内存位置3050中
程序 –
MEMORY ADDRESS | MNEMONICS | COMMENT |
---|---|---|
2000 | LHLD 2050 | L <- M[2050], H <- M[2051] |
2003 | MOV A, L | A <- L |
2004 | RLC | Rotate accumulator content left by 1 bit without carry |
2005 | RLC | Rotate accumulator content left by 1 bit without carry |
2006 | RLC | Rotate accumulator content left by 1 bit without carry |
2007 | RLC | Rotate accumulator content left by 1 bit without carry |
2008 | MOV L, A | L <- A |
2009 | MOV A, H | A <- H |
200A | RLC | Rotate accumulator content left by 1 bit without carry |
200B | RLC | Rotate accumulator content left by 1 bit without carry |
200C | RLC | Rotate accumulator content left by 1 bit without carry |
200D | RLC | Rotate accumulator content left by 1 bit without carry |
200E | MOV H, L | H <- L |
200F | MOV L, A | L <- A |
2010 | SHLD 2070 | M[2070] <- L, M[2071] <- H |
2013 | LDA 2050 | A <- M[2050] |
2016 | MOV B, A | B <- A |
2017 | LDA 2070 | A <- M[2070] |
201A | CMP B | A – B |
201B | JZ 2024 | Jump if ZF = 0 |
201E | MVI A, FF | A <- 01 |
2020 | STA 3050 | M[3050] <- A |
2023 | HLT | END |
2024 | LDA 2051 | A <- M[2051] |
2027 | MOV B, A | B <- A |
2028 | LDA 2071 | A <- M[2071] |
202B | CMP B | A – B |
202C | JZ 2035 | Jump if ZF = 0 |
202F | MVI A, FF | A <- FF |
2031 | STA 3050 | M[3050] <- A |
2034 | HLT | END |
2035 | MVI A, 01 | A <- 01 |
2037 | STA 3050 | M[3050] <- A |
203A | HLT | END |
说明–寄存器A,H,L,B用于通用。
- LHLD 2050:在L中加载存储位置2050的内容,在H中加载2051存储的内容。
- MOV A,L:移动A中L的内容。
- RLC:将A的内容左移一位而不进位。重复执行当前指令4次,以使A的内容反转。
- MOV L,A:在L中移动A的内容。
- MOV A,H:移动A中H的内容。
- RLC:将A的内容左移一位而不进位。重复执行当前指令4次,以使A的内容反转。
- MOV H,L:移动H中L的内容。
- MOV L,A:在L中移动A的内容。
- SHLD 2070:在2070中存储L的内容,在2071中存储H的内容。
- LDA 2050:将内存位置2050的内容加载到A中。
- MOV B,A:在B中移动A的内容。
- CMP B:比较A和B的内容。如果内容相同,则将其设置为零标志,否则将重置。
- JZ 2024:如果ZF = 1,则跳至内存位置2024。
- MVI A,FF:将FF存储在A中。
- STA 3050:将A的内容存储在3050中。
- HLT:停止执行程序,并停止任何进一步的执行。
- LDA 2051:将内存位置2050的内容加载到A中。
- MOV B,A:在B中移动A的内容。
- LDA 2071:将内存位置2071的内容加载到A中。
- CMP B:比较A和B的内容。如果内容相同,则将其设置为零标志,否则将重置。
- JZ 2035:如果ZF = 1则跳转到内存位置2035。
- MVI A,FF:将FF存储在A中。
- STA 3050:将A的内容存储在3050中。
- HLT:停止执行程序,并停止任何进一步的执行。
- MVI A,01:将01存储在A中。
- STA 3050:将A的内容存储在3050中。
- HLT:停止执行程序,并停止任何进一步的执行。